Преобразование double в строку в экспоненциальном представлении быстрее, чем sprintf в С++

Как и в заголовке, как мне преобразовать double в строку в экспоненциальном представлении быстрее, чем sprintf в С++?

У меня есть много (около 1e10) двойных чисел, и мне нужно преобразовать их в строку в следующем формате: ±*.*********E±***, которая имеет 10 значащих цифр.

Но sprintf и stringstream слишком медленные, есть ли более быстрый способ?

Спасибо.


person user1024    schedule 01.02.2015    source источник
comment
Вы пробовали сравнивать скорость if strintf со скоростью sstream с выходными манипуляторами? Я полагаю, что sprintf быстрее :-)   -  person VolAnd    schedule 01.02.2015
comment
конечно sprintf быстрее, чем stringstream, но я хочу быстрее, чем sprintf.   -  person user1024    schedule 01.02.2015
comment
Вы уверены, что sprintf слишком медленный? Если у вас двойники, зачем вам струны? Вы уверены, что это не та операция, для которой вам нужна строка, которая так медленна?   -  person nvoigt    schedule 01.02.2015
comment
Да, я уверен после профилирования в VS2013.   -  person user1024    schedule 01.02.2015
comment
Имеет ли значение порядок? Во что вы выводите эти 10 миллиардов строк, в файл на вращающемся диске? Вы определили, что форматирование является вашим узким местом, и если да, то как вы это сделали и каковы результаты профилирования?   -  person Yakk - Adam Nevraumont    schedule 01.02.2015
comment
Sprintf очень, очень быстрый. Он настроен на скорость поколениями программистов. Единственный способ сделать это быстрее — получить исходный код sprintf и выбросить все, что вам не нужно. Вместо того, чтобы анализировать формат, он должен использовать ваши жестко закодированные значения для точности и ширины.   -  person n. 1.8e9-where's-my-share m.    schedule 01.02.2015
comment
Хотя мне тоже интересно, зачем вам 10 миллиардов строк. Вы собираетесь импортировать их в электронную таблицу или как?   -  person n. 1.8e9-where's-my-share m.    schedule 01.02.2015
comment
Ну, это задача внешней сортировки, отсортировать 10 миллиардов двойников и сохранить их в таком формате, после фрофилинга sprintf заняло 20% времени, так что хочу улучшить.   -  person user1024    schedule 01.02.2015
comment
@н.м. хорошо, это то, что я хочу, но я не знаю, как реализовать свой собственный sprintf, не могли бы вы мне помочь?   -  person user1024    schedule 08.02.2015
comment
Как я уже сказал, вам нужно прочитать исходный код существующей реализации sprintf, понять его и изменить в соответствии с вашими потребностями.   -  person n. 1.8e9-where's-my-share m.    schedule 08.02.2015
comment
@н.м. Но я не смог найти ни одной существующей реализации sprintf. После входа в код я получил функцию _cfltcvt_l, но в Windows нет исходного кода _cfltcvt_l; в Linux я получил __mingw_vsprintf, то же самое, без исходного кода.   -  person user1024    schedule 10.02.2015
comment
не удалось найти ни одной существующей реализации sprintf glibc с открытым исходным кодом. gnu.org/software/libc/download.html   -  person n. 1.8e9-where's-my-share m.    schedule 10.02.2015


Ответы (2)


Использование boost — выход

std::string str = boost::lexical_cast<std::string>(dbl);

Нормальный подход:

std::ostringstream strs;
strs << dbl;
std::string str = strs.str();

Вы должны использовать sprintf() так как это самый быстрый способ.

Время выполнения различных функций @ http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html

Ссылки: http://www.codeproject.com/Questions/166322/converting-number-from-long-double-to-string

Нужна дополнительная помощь? Дайте мне знать

person m0bi5    schedule 01.02.2015
comment
boost быстрее, чем sprintf? И я хочу, чтобы моя строка была в следующем формате: ±*.*********E±***, которая имеет 10 значащих цифр, как мне это сделать? - person user1024; 01.02.2015
comment
здесь есть хорошая статья о производительности zverovich. net/2013/09/07/ , sprintf быстрее - person m0bi5; 01.02.2015
comment
Итак, есть ли способ быстрее, чем sprintf? - person user1024; 01.02.2015
comment
В вашей ссылке сказано, что fmt::Writer быстрее всего преобразуется в строку, но я хочу преобразовать double в строку в экспоненциальном представлении, это то же самое? - person user1024; 01.02.2015

Преобразование, о котором вы просите, не является простой операцией. Вы можете посмотреть Как реализовать char * ftoa(float num) без библиотечной функции sprintf() в C, C++ и JAVA? чтобы быть уверенным.

Я не уверен, что вы найдете реализацию, которая будет быстрее, чем sprintf, потому что она некоторое время находится в стандартной библиотеке C и, возможно, уже была оптимизирована.

Лучшее, что вы можете сделать, это:

  • получить исходный код из стандартной библиотеки C
  • проанализировать, как происходит преобразование
  • сравните со ссылками, найденными в вопросе, указанном выше
  • сравните различные реализации

Я понимаю, что это скорее намек, чем полный ответ, но он слишком длинный для комментария и лучшее, что я могу сделать.

person Serge Ballesta    schedule 01.02.2015
comment
Но я не смог найти какой-либо существующей реализации sprintf. После входа в код я получил функцию _cfltcvt_l, но в Windows нет исходного кода _cfltcvt_l; в Linux я получил __mingw_vsprintf, то же самое, без исходного кода. - person user1024; 10.02.2015