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

时间:2018-03-13 19:03:59

标签: c++ io

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

// 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

的工作相同

1 个答案:

答案 0 :(得分:4)

您在这里不仅仅需要I / O,而且还有os operator<<次来电。{/ p>

因此,当您流式传输某些数据时发生的每一件事 - 例如检查流的初始状态以满足前提条件,或者在调用期间锁定互斥锁以获得线程安全性 - 现在必须发生1000次。 / p>

当您只流一个字符串时,只需要一次。很可能当然,流在它内部进行一些状态管理,同时抨击字符串,但是会有各种各样的东西不需要重复。

即使将流操作暂时排除在等式之外,除非您已启用优化并且该调用被内联,否则这是您不需要的1,000个函数调用。