比如说,让所有小写字符的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
答案 0 :(得分:4)
您在这里不仅仅需要I / O,而且还有os
operator<<
次来电。{/ p>
因此,当您流式传输某些数据时发生的每一件事 - 例如检查流的初始状态以满足前提条件,或者在调用期间锁定互斥锁以获得线程安全性 - 现在必须发生1000次。 / p>
当您只流一个字符串时,只需要一次。很可能当然,流在它内部进行一些状态管理,同时抨击字符串,但是会有各种各样的东西不需要重复。
即使将流操作暂时排除在等式之外,除非您已启用优化并且该调用被内联,否则这是您不需要的1,000个函数调用。