Представленные данные о производительности, связанные с конверсией (и потенциальные проблемы, связанные с производительностью), должны рассматриваться в перспективе. Специальный проект с серьезными высокими требованиями к производительности, скорее всего, потребует специальных решений, которые, скорее всего, выкинут много общих библиотек. Однако существование таких проектов никоим образом не убивало и не умаляло существования общих библиотек. ИУсиление.является одним из такихродовыхБиблиотека.
Более того, если производительность является проблемой, то, по всей вероятности, для подавляющего большинства основных проектовBoost.Convertбудет далеко не лучшим в списке профилировщиков производительности. Например, для измерения накладных расходов, связанных с конверсией, относительно<std::string
>- связанных накладных расходов,<std::string
>был заменен обычныммалоструннымтипом:
struct my_string
{
typedef my_string this_type;
typedef char value_type;
typedef value_type* iterator;
typedef value_type const* const_iterator;
my_string ();
my_string (const_iterator, const_iterator =0);
char const* c_str () const { return storage_; }
const_iterator begin () const { return storage_; }
const_iterator end () const { return storage_ + strlen(storage_); }
this_type& operator= (char const*);
private:
static size_t const size_ = 12;
char storage_[size_];
};
Класс выше по существу является прославленным 12-байтовым буфером символов, достаточным для размещения струнных представлений 32-битных целых чисел. Используются те же преобразователи и те же алгоритмы:
printf("strtol int-to std::string/small-string: %.2f/%.2f seconds.\n",
local::to_str<std::string, int>(boost::cnv::strtol()),
local::to_str< my_string, int>(boost::cnv::strtol()));
printf("spirit int-to std::string/small-string: %.2f/%.2f seconds.\n",
local::to_str<std::string, int>(boost::cnv::spirit()),
local::to_str< my_string, int>(boost::cnv::spirit()));
printf("stream int-to std::string/small-string: %.2f/%.2f seconds.\n",
local::to_str<std::string, int>(boost::cnv::cstream()),
local::to_str< my_string, int>(boost::cnv::cstream()));
Он дал следующие относительные результаты (в сочетании с<gcc
-O3
>):
strtol int-to std::string/small-string: 8.20/2.48 seconds.
spirit int-to std::string/small-string: 8.73/2.81 seconds.
stream int-to std::string/small-string: 12.46/6.94 seconds.
Результаты показывают, что для проектов, которые занимаются конверсиями, связанными со строками, и регулярно развертывают<std::string
>объекты, связанные с конверсией накладные расходы будут перевешиваться накладными расходами<std::string
>.