Эти измерения производительности сосредоточены вокруг форматирования последовательности различных элементов, включая числа с плавающей точкой 2<double
>с использованием различных библиотек и методов. Общие сроки выполнения для этих примеров сравниваются ниже. Мы сравниваем с использованием<sprintf
>, C++ iostreams,ФорматиДух. карма.
Полный исходный код теста производительности см. здесь:format_performance.cpp. Все измерения были выполнены с помощью<1e6
>итераций для каждого типа форматирования (НУМЕРЕНИЯ установлены на<1e6
>).
Код, используемый для измерения производительности для sprintf:
char buffer[256];
for (int i = 0; i < NUMITERATIONS; ++i) {
sprintf(buffer, "[%-14.3f%-14.3f]", 12345.12345, 12345.12345);
}
Код, используемый для измерения производительности стандартных iostreams:
std::stringstream strm;
for (int i = 0; i < NUMITERATIONS; ++i) {
strm.str("");
strm << '['
<< std::setiosflags(std::ios::fixed)
<< std::left
<< std::setprecision(3)
<< std::setw(14)
<< 12345.12345
<< std::setw(14)
<< 12345.12345
<< ']';
}
Код, используемый для измерения производительностиBoost.Format:
std::string generated;
boost::format outformat("[%-14.3f%-14.3f]");
for (int i = 0; i < NUMITERATIONS; ++i)
generated = boost::str(outformat % 12345.12345 % 12345.12345);
Следующий код показывает общие определения, используемые всеми.Дух. КармаИзмерения эффективности, перечисленные ниже:
template <typename T>
struct double3_policy : boost::spirit::karma::real_policies<T>
{
static unsigned int precision(T) { return 3; }
};
typedef boost::spirit::karma::real_generator<double, double3_policy<double> >
double3_type;
double3_type const double3 = double3_type();
Код, используемый для измерения производительностиДух. Кармас использованием простого буфера символов:
char buffer[256];
for (int i = 0; i < NUMITERATIONS; ++i) {
char *p = buffer;
generate(p
, '[' << left_align(14)[double3] << left_align(14)[double3] << ']'
, 12345.12345, 12345.12345);
*p = '\0';
}
В следующей таблице показаны общие результаты работы, собранные при использовании различных компиляторов. Все время измеряется в секундах для<1e6
>итераций (платформа: Windows7, процессор Intel Core Duo(tm), 2,8 ГГц, 4 ГБ ОЗУ). Для более читабельного сравнения результатов см. этотрисунок.
Table 7. Performance comparison for a sequence of several items (all times
in [s], `1e6` iterations)
Библиотека
|
gcc 4.4.0 (32 бит)
|
VC++ 10 (32 бит)
|
Intel 11.1 (32 бит)
|
gcc 4.4.0 (64 бит)
|
VC++ 10 (64 бит)
|
Intel 11.1 (64 бит)
|
---|
спринтф | 1.725 | 1.892 | 1.903 | 1.469 | 1.608 | 1.493 |
iostreams | 4.827 | 5.287 | 4.444 | 3.112 | 3.319 | 2.877 |
Формат | 5.881 | 7.089 | 5.801 | 5.455 | 5.254 | 4.164 |
Дух. Карма | 1.942 | 1.242 | 0.999 | 1.334 | 0.758 | 0.686 |