Pull to refresh

Comments 21

>> Я знаю круче, быстрее и более переносимый способ, опишу его в комментариях — проголосовало 5 человек

Боюсь, что если вы пишите этот способ уже 8 минут, то он нифига не быстрый :)
Как я не удивлялся но boost победил… проверял так:
#include <cstdio>
#include <ctime>
#include <boost/lexical_cast.hpp>

int main() {
	std::string my_str;
	const int num = 30000000;
	for (int test = 0; test < 10; ++test) {
		{
			clock_t start = clock();
			for (int i = 0; i < num; ++i) {
				char str[16];
				int num = sprintf(str, "%d", i);
				my_str.assign(str, num);
			}
			double time_duration = (double) (clock() - start) / CLOCKS_PER_SEC;

			printf("to_std_str_c_way     time = %f , last str = %s\n",
					time_duration, my_str.c_str());
		}
		{
			clock_t start = clock();
			for (int i = 0; i < num; ++i) {
				my_str = boost::lexical_cast<std::string>(i);
			}
			double time_duration = (double) (clock() - start) / CLOCKS_PER_SEC;

			printf("to_std_str_boost_way time = %f , last str = %s\n",
					time_duration, my_str.c_str());
		}
	}

	return 0;
}
gcc? какие у кого показатели скорости?
я выключил отладку и добавил оптимизацию, выглядит так в эклипсе:
g++ -O3 -Wall -c -fmessage-length=0 -MMD -MP -MF«src/test+cpp.d» -MT«src/test+cpp.d» -o «src/test+cpp.o» "../src/test+cpp.cpp"
g++ -O3 test.c
./a.out

to_std_str_c_way time = 6.220000, last str = 29999999
to_std_str_boost_way time = 6.320000, last str = 29999999
to_std_str_c_way time = 6.320000, last str = 29999999
to_std_str_boost_way time = 6.440000, last str = 29999999

и т.д
ubuntu 12.04

boost 1.48
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
А чего удивляться, если в бусте уже как несколько лет lexical_cast был переписан из тупого использования std::stringstream, если на всю катушку используются специализации шаблонов.

А вот измерение времени переделайте, в xBSD системах ваша прога порядочно обломается, ибо там clock() возвращает черти что. Используйте лучше gettimeofday.

А вообще не знаю быстрее boost или нет, я знаю другой способ, но быстрее sprintf это точно. www.jb.man.ac.uk/~slowe/cpp/itoa.html
Может, дело в том, что задачам о преобразовании строки в число уже много-много лет? Или в том, что в точных науках и программировании не принято «угадывать»?
В качестве последнего аргумента, блогпост с разными варианциями itoa, растянувшийся на 5 лет:
www.strudel.org.uk/itoa/ (ex. http://www.jb.man.ac.uk/~slowe/cpp/itoa.html)
Лично у меня c_way на 10-20% быстрей.
gcc версия 4.5.3
Упс, извиняюсь, версию boost в предыдущем сообщении съел НЛО: 1.48.
а у меня на хоть на 3% но быстрее boost.
gcc 4.6.3
В хроме используются base::IntToString[16], base::UintToString[16], base::Int64ToString[16], base::Uint64ToString[16] из string_number_conversions.cc. Не знаю на сколько они быстры, но ничего другого там все равно использовать нельзя.
Не по коду. Просьба автору попытаться прочитать свой заголовок вслух и что-то сделать с пунктуацией.
Вот, кстати:
www_boost_org/doc/libs/1_50_0/doc/html/boost_lexical_cast/performance_html
Sign up to leave a comment.

Articles