Проблема производительности C++: преобразование целого числа в std::stringC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Проблема производительности C++: преобразование целого числа в std::string

Сообщение Anonymous »

Может ли кто-нибудь превзойти производительность моего целого числа в коде std::string, ссылка на который приведена ниже?
Уже есть несколько вопросов, объясняющих, как преобразовать целое число в std::string в C++, например этот, но ни одно из предложенных решений не является эффективным.
Вот готовый к компиляции код для некоторых распространенных методов, с которыми можно конкурировать:
  • «Путь C++», использование строкового потока: http://ideone.com/jh3Sa
  • sprintf, который SO-специалисты обычно рекомендуют тем, кто заботится о производительности: http://ideone.com/82kwR
Вопреки распространенному мнению, boost::lexical_cast имеет собственную реализацию (белую книгу) и не использует строковый поток и числовые операторы вставки. Мне бы очень хотелось сравнить его производительность, потому что другой вопрос предполагает, что он жалкий.
И мой собственный вклад, который конкурентоспособен на настольных компьютерах и демонстрирует подход, который работает на полной скорости и на встроенных системах, в отличие от алгоритмов, зависящих от целочисленного модуля: Если вы хотите использовать этот код, я сделаю его доступным по упрощенной лицензии BSD (разрешено коммерческое использование, требуется указание авторства). Просто спросите.
Наконец, функция ltoa нестандартна, но широко доступна.
  • Версия ltoa для всех, у кого есть компилятор, который ее предоставляет (в ideone ее нет): http://ideone.com/T5Wim
Вскоре я опубликую свои измерения производительности в качестве ответа.
Правила для алгоритмы
  • Предоставьте код для преобразования как минимум 32-битных целых чисел со знаком и без знака в десятичные.
  • Создайте вывод в виде std::string.
  • Нет приемов, несовместимых с потоками и сигналами (например, статические буферы).
  • Вы можете использовать набор символов ASCII.
    />
  • Обязательно протестируйте свой код на INT_MIN на машине с двоичным дополнением, где абсолютное значение невозможно представить.
  • В идеале вывод должен быть посимвольно идентичен канонической версии C++ с использованием stringstream, http://ideone.com/jh3Sa, но все, что ясно понятно, как правильное число, тоже подходит.
  • НОВИНКА: Хотя для сравнения вы можете использовать любые параметры компилятора и оптимизатора (кроме полностью отключенных), код также должен компилироваться и давать правильные результаты как минимум под VC++ 2010 и g++.
Желаем обсуждения
Помимо лучших алгоритмов, я также хотел бы получить некоторые тесты на нескольких разных платформах и компиляторах (давайте использовать пропускную способность в МБ/с в качестве стандартной единицы измерения). Я считаю, что код моего алгоритма (я знаю, что тест sprintf требует некоторых сокращений - теперь исправлено) имеет четко определенное поведение по стандарту, по крайней мере, в предположении ASCII, но если вы видите какое-либо неопределенное поведение или входные данные, для которых выходные данные недействительны, укажите это.
Выводы:
Разные алгоритмы работают для g++ и VC2010, вероятно, из-за разных реализаций std::string на каждом. VC2010 явно лучше справляется с NRVO, избавление от возврата по значению помогло только в gcc.
Найден код, который превосходит sprintf на порядок. ostringstream отстает в 50 и более раз.
Победителем конкурса стал пользователь user434507, создавший код, который выполняет на gcc скорость, равную 350 % моей собственной. Дальнейшие записи закрыты по прихоти сообщества SO.
Текущими (окончательными?) чемпионами по скорости являются:

Подробнее здесь: https://stackoverflow.com/questions/435 ... conversion
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»