【问题标题】:Performance difference of iostream console output between Windows and OSX?Windows 和 OSX 之间 iostream 控制台输出的性能差异?
【发布时间】:2013-07-22 22:50:33
【问题描述】:

给定以下非常简单的 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% 确定它与性能无关,只是与输出机制或其他东西有关。

有人可以证实这一点..吗?只是想知道我的 windows 和视觉工作室都很好。

【问题讨论】:

  • 视觉输出通常很慢,因为无论如何没有人能读得这么快。尝试重定向到文件,看看它是否也很慢。
  • 是的,我也一样(在 windows/VS 上)。但它与 VS 或 XCode 无关。您不是在 VS 或 XCode 中运行程序,是吗?这是 Windows 上控制台显示 (cmd.exe) 的速度问题。如果将输出重定向到文本文件中,在 Windows 上(对我而言)只需 3-4 秒即可打印文件。
  • 是的,我知道这与操作系统或 IDE 无关。谢谢
  • 在我的 MacOSX 上,它运行良好。 100k 点大约需要 5 秒......在同一台计算机上的 Windows 7 上几乎不一样......你使用什么终端? (我在不同的终端上试过,我用 g++ 4.8.1 编译它没有任何优化...)

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


【解决方案1】:

这取决于外部因素。就像正在使用的终端应用程序一样。例如,在 OS X 和 Linux 上,您可以绕过终端并使用以下命令运行它:

./program > /dev/null

大约在 0.2 秒内完成。

标准 C++ 中的 I/O 是一种阻塞操作。这意味着程序在等待操作系统处理输出时“冻结”。最后,如果终端应用程序不是那么快,这将导致程序被“冻结”在等待状态。

【讨论】:

    【解决方案2】:

    std::endl 刷新线路。这样做非常昂贵。

    尝试做:

    std::cout << i << '\n';
    

    在大多数其他常见的交互式 I/O 场景中,std::endl 在与 std::cout 一起使用时是多余的,因为来自 std::cin 的任何输入、到 std::cerr 的输出或程序终止都会强制调用 std ::cout.flush().

    某些来源鼓励使用 std::endl 代替 '\n',这可能会显着降低输出性能。

    Source


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

    您可以通过将输出重定向到/dev/null/ 来避免这种情况:

    ./a.out > /dev/null
    

    关于输出性能,您可以阅读:http://codeforces.com/blog/entry/5217

    【讨论】:

    • 作为记录,std::endl必需的来刷新该行。
    • endl 不是最昂贵的操作,cout
    • @wlyles 没错。但是endl 立即强制输出​​的事实也很昂贵。但是在这里,可以说是cout 使这个循环变得非常慢是正确的。我会更新我的答案。
    【解决方案3】:

    请注意,这是我的更多猜测,但仍然:

    我怀疑你的小测试程序在整体运行时的差异(顺便说一句。Windows / OSX)与各自编译器生成的代码没有任何关系。

    根据我在 Windows 上控制台输出的经验,我强烈怀疑这里的“瓶颈”是将字符数据从您的程序铲到 Windows 控制台和 cmd.exe 显示它。

    这可能只是因为 OSX 上的控制台/shell/bash 比 Windows 控制台更快地接受程序的输出。

    您可以尝试将此程序的输出重定向到一个文件(通过在 CLI test.exe &gt; output.txt 上启动它时使用重定向)并查看您是否以这种方式测量任何差异。

    【讨论】:

      猜你喜欢
      • 2022-11-09
      • 2013-12-18
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 2013-06-28
      相关资源
      最近更新 更多