Здравствуйте, Feonyf, Вы писали:
F>Пришел в голову способ как остаться при интерфейсе boost::lexical_cast но при этом сохранить скорость на уровне itoa atoi
F>1. А почему бустовцы так не сделали ?
Потому что локали.
В твоем варианте, насколько я понимаю, их нет
Если локали не нужны, есть специальный макрос, типа BOOST_ASSUME_C_LOCALE (не помню точно), попробуй сравнить с ним
Здравствуйте, Feonyf, Вы писали:
F>Здравствуйте, jazzer, Вы писали:
J>>В твоем варианте, насколько я понимаю, их нет
F>Нету. Но подумаю как сделать.
F>У lexical cast бустовского тоже нету локалей похоже F>http://lists.boost.org/boost-users/2006/11/23444.php
F>
>> Is it possible to set a locale for the lexical_cast?
Локаль есть, та, что получили программа при старте, но ты не можешь ее изменить в рантайме на какую-то свою.
> Someone was asking me today about the inefficiency of lexical_cast for
> its common itoa/atoi-like usage, and it occurred to me that it could
> *easily* be optimized to handle the common cases by dispatching to
> itoa/atoi ftoa/atof where available, and even sprintf. Seems like a
> great idea to me.
This can be easily done only if a program always uses the classic C and C++
locales. Optimization for some combinations of types is already available if
you set BOOST_LEXICAL_CAST_ASSUME_C_LOCALE.
Mapping between C and C++ locales is hard, if possible at all in a portable way.
Так что попробуй BOOST_LEXICAL_CAST_ASSUME_C_LOCALE и кинь результаты сравнения
Здравствуйте, Feonyf, Вы писали: F>однако boost::lexical_cast показал примерно такойже результат как без BOOST_LEXICAL_CAST_ASSUME_C_LOCALE F>Может что то я неправильно сделал ?
Меня смущают непонятные вещи типа tstring. Я делал три уровня оптимизации, но все они предполагают, что типы Source и Target имеют известные типы. tstring в их число не входит.
Я не помню все детали, надо смотреть в коде, поэтому перечислю только главные идеи этих уровней
1. Source имеет тип, у которого известен максимальный размер текстового представления, но нет оптимизированной процедуры преобразования в Source в строку и нет оптимизированной процедуры преобразования из строки в Target. Например, мне лениво было разбираться с форматом IEEE для double. В таких случаях, вместо std::stringstring используется std::streambuf, указывающий на буфер на стеке.
2. Source имеет тип, который мы умеем преобразовать в строку _и_ Target имеет тип, который мы может преобразовать из строки. В таком случае ни std::stringstring ни std::streambuf не создается, а создается только объект std::locale.
3. Так же как пункт 2, но BOOST_LEXICAL_CAST_ASSUME_C_LOCALE позволяет избавится от создания объекта std::locale.
Наоптимизируют в обход stringstream для каждого типа. И потом зададут себе вопрос:
а зачем этот stringstream вообще нужен?
Нативный способ гораздо быстрее работает чем stringstream. Цифр приводить не буду, сами поиграетесь если нужно (тест выделять мне неохото).
Нативный способ: