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