LINUX.ORG.RU

Самое быстрое преобразование float в строку

 , , ,


2

2

Нравится мне делать подобные штучки :)

Результаты бенчмарка (со всяческими другими быстрыми вариантами):

 erthink       ... [min   21.900ns, rms   56.925ns, max   72.200ns]
 floaxie       ... [min   25.200ns, rms   66.722ns, max   88.900ns]
 emyg          ... [min   32.600ns, rms   76.577ns, max   92.600ns]
 milo          ... [min   32.200ns, rms   76.754ns, max   92.400ns]
 grisu2        ... [min   67.600ns, rms   89.862ns, max  110.100ns]
 doubleconv    ... [min   58.400ns, rms   94.065ns, max  116.500ns]
 fmt           ... [min   82.900ns, rms  134.049ns, max  159.000ns]
 fpconv        ... [min   87.400ns, rms  136.806ns, max  159.000ns]
 sprintf       ... [min  634.600ns, rms  717.793ns, max  783.600ns]
 ostrstream    ... [min 1019.400ns, rms 1104.349ns, max 1168.800ns]
 ostringstream ... [min 1107.200ns, rms 1200.868ns, max 1275.700ns]
 null          ... [min    1.200ns, rms    1.277ns, max    1.300ns]

$ gcc -v
gcc version 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)

Делюсь, думаю кому-нибудь пригодится. Лицензия zLib, исходники и бенчмарк с примером использования на github. Функция header-only и совсем не делает ничего лишнего:

  • генерирует минимум символов (намеренно без десятичной точки);
  • не пишет \0 в конце;
  • не проверяет inf и nan (ибо во многих случаях нужна кастомная обработка, например как в json);
  • но всё корректно.

Поэтому смотреть лучше начиная с примера по ссылке. При необходимости «красоты», в том числе вывода десятичной точки можно делать примерно так.

Deleted

Последнее исправление: Deleted (всего исправлений: 1)

Ответ на: комментарий от RazrFalcon

Как на счёт https://github.com/Alexhuszagh/rust-lexical ?

Если я правильно понимаю, то у него 10000 итераций за 0.5 ms. Т.е. порядка 50 ns на одно преобразование.

А использованный мной бенчмарк считает min/max/rms для разного кол-ва получаемых десятичных цифр.

В абсолютных значениях эти цифры близки, осталось понять на какой частоте CPU они получены ;) Поэтому я предпочитаю менять в тактах.

Ещё может быть ощутимая разница из-за разного кода циклов и замеров. Поэтому лучше замерять одной линейкой. Но мопед (бенчмарк) не мой, просто взял более-менее известный.

Тем не менее, судя по остальным моим цифрам - у меня вышло немного быстрее (до 30% с учётом что код от clang-llvm медленнее на 5-10% а таких кейсах).

Deleted
()
Ответ на: комментарий от tz4678

это не имеет смысла

Угу, тепловая смерть вселенной уже близко (

Deleted
()
Ответ на: комментарий от Iron_Bug

Уже добавлен fmt, который быстрее

Deleted
()

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

Ну как-бы есть предыстория которую лучше знать до «выдачи ценных» советов )

Ещё лет 5-7 назад google опубликовал свою double-conversion. Потом в 2014 Milo сделал свою реализацию grisu2. Теперь я немного «побаловался».

И на всякий повторю - бенчмарк не мой, а исторически сложившейся/унаследованный. Но если желаете что-то добавить - я постараюсь отсмотреть и принять pull-requestы.

Deleted
()
Ответ на: комментарий от Deleted

я уже 25 лет балуюсь. так что не надо мне рассказывать. просто я в последние лет 15 маздай не юзаю. но таки разница в скорости между маздаем и линём всегда была существенная и я не думаю, что сейчас что-то изменилось. и разница между компиляторами существенная. насчёт разных стандартных библиотек - не задавалась таким вопросом. хотя могу провести такие эксперименты, но просто не требовалось.

сравнительную ценность представляют тесты на одном и том же железе. у меня лично маздая нигде нет.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 2)
Ответ на: комментарий от Iron_Bug

Я имел в виду историю алгоритмов аля-grisu и соответствующих замеров.

Тем не менее, совершенно согласен (и где-то выше писал об этом) что многое зависит от бенмарка и компилятора.

А маздайный компилятор (в смысле msvc) мягко говоря не радует (ну и хрен с ним, mustdie).

Deleted
()
Ответ на: комментарий от anonymous

Быстрее, но но иногда просят/нужно другое.

А ещё быстрее просто 8 байт оставить.

Deleted
()
Ответ на: комментарий от Deleted

возьми icc. раньше он был бесплатным для девелоперов. сейчас вряд ли, но кого и когда на маздае останавливал копирайт? :)

icc генерил код раза в полтора шустрее, чем родной для маздая компиллер. причём даже для amd.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

Знамо...

Icc хорош в векторзации циклов, раз в 100 (по эвристикам). Но без вектоизируемых кейсов (или если уже сделано) то gcc и/или clang на коне.

Deleted
()
Ответ на: комментарий от Deleted

Камрады, ну давайте тщательнее перегонять (и употреблять) c2h5oh :)

Не употребляю.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

добавьте fmt

Оно есть исходно, см стартер-топик. Тем не менее, теоретически это могут быть разные сорта. Буду признателен за сами-знаете, включая PR.

Слово «тупо» отлично описывает вас и вашу жизнь.

Предлагаю рефлексировать в меру.

Deleted
()
Ответ на: комментарий от Deleted

Оно есть исходно, см стартер-топик.

Пропустил, спасибо. Если это тот самый fmtlib, то его положение в результатах бенчмарках меня устраивает. Как и его удобство + возможности.

Предлагаю рефлексировать в меру.

Пожалуй вы правы, некоторых персонажей лучше просто игнорировать.

andreyu ★★★★★
()
Ответ на: комментарий от anonymous

Подозреваю это для секты хфт.

anonymous
()

Классная штуковина, сохранил ссылку, когда потребуется буду пользоваться, спасибо!

bonta ★★★★★
()
Последнее исправление: bonta (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.