【发布时间】:2015-10-10 01:15:05
【问题描述】:
我想比较printf和cout在C++中的速度,使用cout的代码:
#include <iostream>
int main()
{
for (int i = 0; i < 150000; i++)
std::cout << "Hello!";
}
这个代码是printf:
#include <cstdio>
int main()
{
for (int i = 0; i < 150000; i++)
std::printf("Hello!");
}
我多次运行这两个程序,结果如下(使用 g++ 编译器):
cout:17.116 秒
printf:9.153 秒
所以printf 比cout 快两倍。我在 Stack Overflow 中搜索了这种行为背后的原因,我发现 printf 比 cout 快,因为它是一个函数,而 cout 是一个对象。但我也了解到cout 速度较慢,因为它与标准 C 流同步。
所以我接下来要做的是使用以下代码关闭所有 iostream 标准流与其对应的标准 C 流的同步:
#include <iostream>
int main()
{
std::ios_base::sync_with_stdio(false);
for (int i = 0; i < 150000; ++i)
std::cout << "Hello!";
}
令人惊讶的是,这就是我得到的:
printf:9.153 秒
cout同步开启:17.116 秒
cout同步关闭:1.146 秒
哇!差别很大!
所以我的问题是:总是关闭同步是一个好习惯吗?
提前致谢。
【问题讨论】:
-
打印到标准输出是程序的主要部分吗?那么是的,这可能是个好主意,
-
“总是……会是一个好习惯吗?”。不,无论问题如何结束,都没有一个总是正确的解决方案。
-
一些 cmets :这样的时间在很大程度上取决于 1) 标准输出插入到什么 2) 平台 3) 标准库实现。此外,您并不总是可以选择关闭同步(例如,必须在程序开始时完成)。与 C 流同步也是一个很好的特性,尤其是当你调用 C 库执行 IO 时。
-
仅供参考,如果您关闭同步,则
cout不再是线程安全的。 -
" 发现 print() 比 cout 快,因为它是一个函数,而 cout 是一个对象。” 如果您能链接到 SO 上的位置,我将不胜感激你已经读过了。听起来很……令人惊讶。您是否还进行了优化编译?哪个编译器,平台?