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