Windows和OSX之间的iostream控制台输出的性能差异?

时间:2013-07-23 17:51:41

标签: c++ performance visual-studio-2012 console-application

给出以下非常简单的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;视觉工作室很好。

3 个答案:

答案 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在与st​​d :: cout一起使用时是多余的,因为来自std :: cin,输出到std :: cerr或程序终止的任何输入强制调用std :: cout.flush()。

     

在某些来源的鼓励下,使用 std :: endl 代替'\ n'可能会严重降低输出性能。

Source


编辑: 输出操作成本高,取决于外部因素。这就是为什么它在这里很慢。例如,正在使用的终端应用程序可能是某些性能问题的因素。

您可以通过将输出重定向到/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上启动时使用重定向),看看您是否以这种方式测量任何差异。