为什么一次打印一个字符比提前连接它们慢
Why is printing one character at a time slower than concatenating them in advance?
比如说,将所有小写字符的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 次调用 os
的operator<<
。
因此,当您流式传输某些数据时发生的每一件事(例如,检查流的初始状态以满足先决条件,或在调用期间锁定互斥锁以获得线程安全(现在都必须发生 1,000 次。
当您只流式传输一个字符串时,只需发生一次。当然,流很可能在它内部执行一些状态管理,同时破坏字符串,但会有各种各样的事情不需要重复。
即使暂时将流操作排除在外,除非您打开了优化并且该调用被内联,否则您不需要 1,000 次函数调用。
相关文章:
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- Qt将信号与另一个类方法连接
- 在 C++20 中将多个范围适配器连接到一个范围中
- 如何在使用 getch 后在另一个字符串的末尾连接一个字符串
- 在线程 A 中创建一个 std::thread 对象,在线程 B 中连接
- 为什么我们应该为网络连接指定一个端口?
- 为什么一个表达式中的 std::string 连接给出的结果与逐个字符不同的结果?
- Qt的新信号/时隙语法问题 - 连接到一个简单的函数
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 一个 ui 成员的 Qt 连接和同一连接中的两个信号
- 将文本和二进制数据连接到一个文件中
- 我正在编写一个简单的客户端套接字应用程序,但在连接后服务器收到一个空缓冲区
- 如何将X 2维数组连接到一个三维阵列中
- 如何将多个字符连接成一个整数
- 当试图在ostringstream中连接一个字符串时,这些字符串的内容会被修改和重构,字符串会在开始时被添加
- 除了字符串流,还有其他方法吗?连接一个由多种类型的变量组成的字符串
- Boost asio-多个streambufs或每个连接一个
- 我需要连接一个unsigned char数组的两个元素并保持它为unsigned char
- Qt代码不编译时,我试图连接一个信号到插槽
- 连接一个char 2D数组元素和c++中的int