Из того, что я читаю онлайн, библиотека fmt должна быть невероятно намного быстрее, чем, например, stringstreams.
Однако я провел несколько простых тестов (измерение системного времени, см. Код ниже), и кажется, что fmtвсегда медленнее, чем, например, струнные потоки. Я что-то не так делаю?
uint64_t start;
uint64_t stop;
long MAXCOUNT = 10000000;
std::srand(123);
int* numbers = new int[MAXCOUNT];
for ( int i = 0; i < MAXCOUNT; i++) {
numbers[i] = std::rand();
}
{
std::string result;
start = currentTimeInMillis();
for ( int i = 0; i < MAXCOUNT; i++) {
result += fmt::format("Number {} is great!", numbers[i]);
}
stop = currentTimeInMillis();
fmt::print("timing fmt : {} ms / string length: {}\n", stop-start, result.size());
}
{
std::string result;
std::stringstream ss;
start = currentTimeInMillis();
for ( int i = 0; i < MAXCOUNT; i++) {
ss << "Number " << numbers[i] << " is great!";
}
result = ss.str();
stop = currentTimeInMillis();
fmt::print("timing stds: {} ms / string length: {}\n", stop-start, result.size());
}
Типичный результат (уровень оптимизации O3 - чем меньше, тем хуже) этого кода:
timing fmt : 1414 ms / string length: 264823200
timing stds: 1287 ms / string length: 264823200