给出以下非常简单的for循环:
int main (void) {
for (int i = 0 ; i < 1000000; i++) {
std::cout<<i<<std::endl;
}
}
使用Microsoft visual studio 2012在干净的Windows 8专业版上运行此代码,每100k打印大约需要15秒。
在mac os x上,使用同一台计算机,xcode只需3秒即可输出1条生产线。
我几乎100%确定它与性能无关,它只是与输出机制有关的东西。
有人可以证实这一点吗?只知道我的窗户&amp;视觉工作室很好。
答案 0 :(得分:3)
这取决于外部因素。就像使用的终端应用程序一样。例如,在OS X和Linux上,您可以绕过终端并使用以下命令运行它:
./program > /dev/null
它在大约0.2秒内完成。
标准C ++中的I / O是一种阻塞操作。这意味着程序在等待操作系统处理输出时“冻结”。最后,如果终端应用程序不那么快,这将导致程序在等待状态下“冻结”很多。
答案 1 :(得分:2)
std::endl
冲洗线。这样做非常昂贵。
尝试:
std::cout << i << '\n';
在大多数其他常见的交互式I / O场景中,std :: endl在与std :: cout一起使用时是多余的,因为来自std :: cin,输出到std :: cerr或程序终止的任何输入强制调用std :: cout.flush()。
在某些来源的鼓励下,使用 std :: endl 代替'\ n'可能会严重降低输出性能。
编辑: 输出操作成本高,取决于外部因素。这就是为什么它在这里很慢。例如,正在使用的终端应用程序可能是某些性能问题的因素。
您可以通过将输出重定向到/dev/null/
来避免这种情况:
./a.out > /dev/null
关于输出性能,您可以阅读:http://codeforces.com/blog/entry/5217
答案 2 :(得分:1)
请注意,这是我的更多猜测,但仍然是:
我怀疑的是,在整个运行时你的小测试程序的差异(btw.Windows / OSX)与相应编译器生成的代码没有任何关系。
根据我在Windows上使用控制台输出的经验,我强烈怀疑这里的“瓶颈”是将程序中的字符数据铲除到Windows控制台和显示它的cmd.exe。
可能只是OSX上的console / shell / bash比Windows控制台更快地接受程序的输出。
您可以尝试将此程序的输出重定向到一个文件(在CLI test.exe > output.txt
上启动时使用重定向),看看您是否以这种方式测量任何差异。