Comments 21
>> Я знаю круче, быстрее и более переносимый способ, опишу его в комментариях — проголосовало 5 человек
Боюсь, что если вы пишите этот способ уже 8 минут, то он нифига не быстрый :)
Боюсь, что если вы пишите этот способ уже 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 -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
и т.д
./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
и т.д
А чего удивляться, если в бусте уже как несколько лет lexical_cast был переписан из тупого использования std::stringstream, если на всю катушку используются специализации шаблонов.
А вот измерение времени переделайте, в xBSD системах ваша прога порядочно обломается, ибо там clock() возвращает черти что. Используйте лучше gettimeofday.
А вообще не знаю быстрее boost или нет, я знаю другой способ, но быстрее sprintf это точно. www.jb.man.ac.uk/~slowe/cpp/itoa.html
А вот измерение времени переделайте, в 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)
В качестве последнего аргумента, блогпост с разными варианциями 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
gcc версия 4.5.3
По ответам на Stackoverflow говорят сильно зависит от версии буста stackoverflow.com/questions/1250795/very-poor-boostlexical-cast-performance
Вот результаты с версией буста 1.49 www.boost.org/doc/libs/1_49_0/doc/html/boost_lexical_cast/performance.html
Упс, извиняюсь, версию boost в предыдущем сообщении съел НЛО: 1.48.
а у меня на хоть на 3% но быстрее boost.
gcc 4.6.3
gcc 4.6.3
_itoa?
Чувствую себя здесь одиноким :)
В хроме используются
base::IntToString[16]
, base::UintToString[16]
, base::Int64ToString[16]
, base::Uint64ToString[16]
из string_number_conversions.cc. Не знаю на сколько они быстры, но ничего другого там все равно использовать нельзя.Есть библиотека code.google.com/p/stringencoders/ в которой есть очень быстрое преобразование чисел в строки code.google.com/p/stringencoders/wiki/PerformanceNumToA.
В особо критичных к скорости случаях я использую эту библиотеку.
В особо критичных к скорости случаях я использую эту библиотеку.
Не по коду. Просьба автору попытаться прочитать свой заголовок вслух и что-то сделать с пунктуацией.
Вот, кстати:
www_boost_org/doc/libs/1_50_0/doc/html/boost_lexical_cast/performance_html
www_boost_org/doc/libs/1_50_0/doc/html/boost_lexical_cast/performance_html
Sign up to leave a comment.
Что быстрее преобразует int в std::string в с++? Настройки компилятора на максимальную скорость