полностью зависит от производительности используемого преобразователя. Несколько преобразователей были протестированы на конверсию строк в основные типы и в определенный пользователем тип.
В свою очередь, относительная и абсолютная производительность каждого конкретного преобразователя зависит от платформы, используемого компилятора и конкретной реализации базового компонента преобразования (<std::stream
>,<printf
>,Boost.Spirit).и т.д. Следовательно, приведенные ниже результаты являются лишь приблизительным указаниемотносительнойпроизводительности упомянутых преобразователей на тестируемых платформах.
Составленный с помощью gcc-4.8.2 на 32-битном Ubuntu 14.04 тесты дали следующие относительные результаты:
str-to-int: spirit/strtol/lcast/scanf/stream= 1.31/ 2.15/ 3.41/ 6.72/ 7.24 seconds.
str-to-lng: spirit/strtol/lcast/scanf/stream= 1.24/ 2.39/ 4.18/ 6.63/ 7.20 seconds.
str-to-dbl: spirit/strtol/lcast/scanf/stream= 1.45/ 4.07/ 5.19/ 11.13/ 14.47 seconds.
int-to-str: spirit/strtol/lcast/prntf/stream= 7.49/ 6.48/ 8.01/ 11.76/ 9.31 seconds.
lng-to-str: spirit/strtol/lcast/prntf/stream= 7.34/ 6.89/ 8.43/ 11.55/ 9.32 seconds.
dbl-to-str: spirit/strtol/lcast/prntf/stream= 14.13/ 13.56/ 50.03/ 46.25/ 44.72 seconds.
Составленный с помощью gcc-4.6.3 на 64-битном Ubuntu 12.04 тесты дали следующие относительные результаты:
str-to-int: spirit/strtol/lcast/scanf/stream= 0.29/ 0.47/ 1.14/ 2.75/ 3.15 seconds.
str-to-dbl: spirit/strtol/lcast/scanf/stream= 0.40/ 1.44/ 1.70/ 4.32/ 5.59 seconds.
int-to-str: spirit/strtol/lcast/prntf/stream= 1.75/ 1.53/ 2.06/ 3.34/ 2.73 seconds.
dbl-to-str: spirit/strtol/lcast/prntf/stream= 5.64/ 3.00/ 17.89/ 14.24/ 13.67 seconds.
Основываясь на результатах, учитывая все обстоятельства, я склонен заключить, что явного победителя нет:
- Spirit.Qi- на основе преобразователя был самым быстрым для струнных к основным<
int
>,<double
>конверсиям. Таким образом, он может быть хорошим кандидатом для задач, преимущественно выполняющих такого рода преобразования (с учетомДуха.Qiограничений, связанных с преобразованием);Дух. Кармана струнувыступление не показалось столь впечатляющим;
- <
std::iostream
>- на основе преобразователя был сравнительно медленным. Тем не менее, учитывая его зрелость, доступность и поддержку форматирования, возможно, стоит рассмотреть, не является ли производительность конверсии вашей основной задачей.
- <
strtol
>-вдохновленный конвертер был достаточно быстрым и с поддержкой форматирования мог быть привлекательным универсальным. Следует отметить, что он нигде не является столь зрелым, как<boost::cnv::lexical_cast
>и<boost::cnv::stream
>. Таким образом, багов следует ожидать.
Для определенных пользователем типов<cnv::lexical_cast
>,<cnv::cstream
>и<cnv::strtol
>были протестированы со следующими относительными результатами:
str-to-user-type: lcast/stream/strtol=1.14/0.59/0.23 seconds.
user-type-to-str: lcast/stream/strtol=1.97/0.39/0.24 seconds.
Для обеспеченияконверсий типа строка-пользовательитипа пользователя-струнапервые два развертывают одну и ту же стандартную<std::iostream
>библиотеку. Однако<boost::cnv::cstream
>значительно превосходит<boost::lexical_cast
>в этих испытаниях. Результаты, вероятно, отражают различные базовые конструкции. Стандартный шаблон развертыванияBoost.Convertзаключается в создании преобразователя или преобразователей один раз, а затем повторном их использовании.<boost::lexical_cast
>, с другой стороны, благодаря своей конструкции, создает и затем уничтожает<std::stream
>экземпляр каждый раз, когда функция называется и<boost::lexical_cast
>производительностьтаблица указывает, что «std::stringstreamсо строительством» эксплуатация значительно дороже по сравнению с «std::stringstreamбез строительства».
<boost::cnv::strtol
>Поддержка типов пользователей была реализована аналогично, но без накладных расходов<std::stream
>. Это привело к лучшим результатам из трех.
Основываясь на данных о производительности, я склонен заключить, что, учитывая безопасность типов и преимущества, предоставляемые.Boost.Convertфреймворк, он (с соответствующими преобразователями), вероятно, должен быть первым выбором для задач, связанных с конверсией.