为什么{fmt}比std :: stringstream慢?

问题描述 投票:0回答:1

根据我在网上阅读的内容,fmt库的运行速度要比例如字符串流。

但是,我做了一些简单的基准测试(测量系统时间,请参见下面的代码),看来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
c++ performance stringstream fmt
1个回答
1
投票

首先,我在计算机上没有得到相同的数字,对我来说fmt更快:

timing fmt : 1713 ms   /   string length: 264825935
timing stds: 2483 ms   /   string length: 264825935

第二,为了公平起见,请替换

result += fmt::format("Number {} is great!", numbers[i]);

with

fmt::format_to(std::back_inserter(result), "Number {} is great!", numbers[i]);

这可以缩短(再次在我的机器上)的时间

timing fmt : 1153 ms   /   string length: 264825935
timing stds: 2482 ms   /   string length: 264825935
© www.soinside.com 2019 - 2024. All rights reserved.