为什么一次打印一个字符比提前连接它们慢

Why is printing one character at a time slower than concatenating them in advance?

本文关键字:连接 一个 一次 打印 为什么 字符      更新时间:2023-10-16

比如说,将所有小写字符的std::vector重复 1000 次,并首先逐个字符打印它们,然后通过连接显示第二种方法至少快两倍:

// Averaged by 1000 measurements
Chars mean: 1.314961314958 ms
Joined mean: 0.430487430487 ms

输出方法本身:

void print_char(const std::vector<char>& chars, std::ostream& os)
{
    for (const char x : chars)
        os << x;
}
void print_join(const std::vector<char>& chars, std::ostream& os)
{
    std::string joined;
    joined.reserve(chars.size());
    std::copy(chars.begin(), chars.end(), std::back_inserter(joined));
    os << joined;
}

为什么会这样?我认为内置的 IO 缓冲与累加器字符串joined执行相同的工作

您在这里拥有的不仅仅是 I/O - 您有 1,000 次调用 osoperator<<

因此,当您流式传输某些数据时发生的每一件事(例如,检查流的初始状态以满足先决条件,或在调用期间锁定互斥锁以获得线程安全(现在都必须发生 1,000 次。

当您只流式传输一个字符串时,只需发生一次。当然,流很可能在它内部执行一些状态管理,同时破坏字符串,但会有各种各样的事情不需要重复。

即使暂时将流操作排除在外,除非您打开了优化并且该调用被内联,否则您不需要 1,000 次函数调用。