Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> форматированный ввод-вывод. производительность. 
V
    Опции темы
boostcoder
Дата 2.6.2011, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем привет.

следующий код:
Код

#include <iostream>
#include <sstream>
#include <cstdio>
#include <stdint.h>
#include <sys/time.h>
#include <string.h>

static const size_t iterations = 1024*100;
static const size_t item_val = 33;
static const size_t item_len = 3; // 0x33,0x33,0x20
static const size_t buf_size = iterations*item_len;
static char buf[buf_size];

inline uint64_t current_time() {
   struct timeval tv;
   gettimeofday(&tv, 0);
   return (tv.tv_sec*1000)+(tv.tv_usec/1000);
}

/***************************************************************************/

uint64_t binary_test() {
   uint64_t start = current_time();
   for ( size_t idx = 0; idx < iterations; ++idx ) {
      memcpy(&buf[idx*item_len], &item_val, item_len);
   }
   return current_time()-start;
}

/***************************************************************************/

uint64_t sprintf_test() {
   uint64_t start = current_time();
   for ( size_t idx = 0; idx < iterations; ++idx ) {
      sprintf(&buf[idx*item_len], "%02d ", item_val);
   }
   return current_time()-start;
}

/***************************************************************************/

uint64_t sscanf_test() {
   uint64_t start = current_time();
   size_t tmp;
   for ( size_t idx = 0; idx < iterations; ++idx ) {
      sscanf(&buf[idx*item_len], "%02d ", &tmp);
   }
   return current_time()-start;
}

/***************************************************************************/

uint64_t ostringstream_test() {
   uint64_t start = current_time();
   std::ostringstream os;
   os.rdbuf()->pubsetbuf(buf, buf_size);
   
   for ( size_t idx = 0; idx < iterations; ++idx ) {
      os << item_val << ' ';
   }
   return current_time()-start;
}

/***************************************************************************/

uint64_t istringstream_test() {
   uint64_t start = current_time();
   std::istringstream is;
   is.rdbuf()->pubsetbuf(buf, buf_size);
   size_t tmp;
   char space;
   for ( size_t idx = 0; idx < iterations; ++idx ) {
      is >> tmp >> space;
   }
   return current_time()-start;
}

/***************************************************************************/

int main() {
   std::cout << "binary_test()       : " << binary_test() << std::endl;
   std::cout << "sprintf_test()      : " << sprintf_test() << std::endl;
   std::cout << "sscanf_test()       : " << sscanf_test() << std::endl;
   std::cout << "ostringstream_test(): " << ostringstream_test() << std::endl;
   std::cout << "istringstream_test(): " << istringstream_test() << std::endl;
}

/***************************************************************************/

http://liveworkspace.org/code/1d747c7e7fe2...3c646bfe48cde66

выдает такие результаты:
Цитата

binary_test()       : 13
sprintf_test()      : 18
sscanf_test()       : 4779
ostringstream_test(): 9
istringstream_test(): 16

время в миллисекундах.

любопытны три момента:
1. почему sscanf() работает так долго?
2. почему ostringstream работает быстрее чем sprintf() ?
3. может кто-то встречал реализацию форматировщиков ввода-вывода, работающую быстрее протестированных?

спасибо.


Это сообщение отредактировал(а) boostcoder - 2.6.2011, 14:29
PM WWW   Вверх
mes
Дата 2.6.2011, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  2.6.2011,  11:08 Найти цитируемый пост)
ostringstream работает быстрее чем sprintf() 

хм.. а не кажется ли, что сравнение изначально нечестное ?

Это сообщение отредактировал(а) mes - 2.6.2011, 12:21


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 2.6.2011, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  2.6.2011,  12:20 Найти цитируемый пост)
а не кажется ли, что сравнение изначально нечестное ?

в смысле, что stream`ам приходится выполнять по две операции?
или что?
PM WWW   Вверх
mes
Дата 2.6.2011, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



в том смысле что принтфы надо мерять хотя бы с тем же boost.format, а не с ними _голыми_. 


Это сообщение отредактировал(а) mes - 2.6.2011, 12:34


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 2.6.2011, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes, мне нужно форматировать ввод-вывод. потому я выбрал два варианта: 1) sprintf/sscanf, 2) ostringstream/istringstream.
кандидатуру boost.format не рассматривал.

PM WWW   Вверх
mes
Дата 2.6.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



надо отличать форматированный вывод, от форматированного по шаблону... у первого естесственно будет выйгрыш в скорости.. 



--------------------
PM MAIL WWW   Вверх
Alca
Дата 2.6.2011, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Это релизная сборка или дебажная?


--------------------
PM WWW ICQ Skype Jabber   Вверх
boostcoder
Дата 2.6.2011, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes, значит мне нужен форматированный.

Alca, gcc -O2 main.cpp -omain
PM WWW   Вверх
mes
Дата 2.6.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



глянул результаты  :
Цитата(boostcoder @  2.6.2011,  11:08 Найти цитируемый пост)
sscanf_test()       : 679550


scanf действительно меденнее, чем должен был быть по идеи..


--------------------
PM MAIL WWW   Вверх
Alca
Дата 2.6.2011, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



http://codepad.org/kvs8ZG4Q
Код

sscanf(&buf[idx*item_len], "%02d ", &tmp);


маленький фикс:  smile 
Код

sscanf(&buf[idx*item_len], "%02zu ", &tmp);


Добавлено через 1 минуту и 49 секунд
http://codepad.org/4lZe5qee
Цитата

cc1plus: warnings being treated as errors
In function 'clock_t sscanf_test()':
Line 51: warning: ISO C++ does not support the 'z' scanf length modifier

 smile

Добавлено через 5 минут и 48 секунд
Цитата

Alca, gcc -O2 main.cpp -omain

а если с -03?

Это сообщение отредактировал(а) Alca - 2.6.2011, 13:09


--------------------
PM WWW ICQ Skype Jabber   Вверх
boostcoder
Дата 2.6.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  2.6.2011,  12:49 Найти цитируемый пост)
scanf действительно меденнее, чем должен был быть по идеи

вот и я о том же!

Цитата(Alca @  2.6.2011,  13:09 Найти цитируемый пост)
"%02zu "

это не существенно.

Цитата(Alca @  2.6.2011,  13:09 Найти цитируемый пост)
а если с -03?


с О2:
Цитата

binary_test()       : 8
sprintf_test()      : 232
sscanf_test()       : 678191
ostringstream_test(): 161
istringstream_test(): 163

с О3:
Цитата

binary_test()       : 8
sprintf_test()      : 224
sscanf_test()       : 685044
ostringstream_test(): 166
istringstream_test(): 161


т.е. разницы почти никакой.
PM WWW   Вверх
Alca
Дата 2.6.2011, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Цитата

может кто-то встречал реализацию форматировщиков ввода-вывода, работающую быстрее протестированных?

http://gitorious.org/kirelagin_asm/sprintf...ter/sprintf.asm


--------------------
PM WWW ICQ Skype Jabber   Вверх
boostcoder
Дата 2.6.2011, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



хм.. smile 
жаль на асме...
PM WWW   Вверх
Alca
Дата 2.6.2011, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Мне попадались как-то, но не помню по каким ключевым словам гуглил


--------------------
PM WWW ICQ Skype Jabber   Вверх
boostcoder
Дата 2.6.2011, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



похоже, придется stream`ы юзать.

всем спасибо.

PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0864 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.