极慢的std :: cout使用MS Compiler

时间:2014-03-25 11:48:16

标签: c++ performance visual-c++ cout

我正在打印计算的多次迭代的进度,输出实际上是它中最慢的部分,但只有当我使用Visual C ++编译器时,MinGW才能在同一系统上正常工作。

请考虑以下代码:

#include <iostream>
#include <chrono>

using namespace std;
#define TO_SEC(Time) \
    chrono::duration_cast<chrono::duration<double> >(Time).count();
const int REPEATS = 100000;

int main() {
    auto start_time = chrono::steady_clock::now();

    for (int i = 1; i <= REPEATS; i++) 
        cout << '\r' << i << "/" << REPEATS;

    double run_time = TO_SEC(chrono::steady_clock::now() - start_time);
    cout << endl << run_time << "s" << endl;
}

现在用MinGW编译时得到的输出(&#34; g ++ source.cpp -std == c ++ 11&#34;)是:

100000/100000 
0.428025s

现在,使用Visual C ++编译器2013年11月编译时得到的输出(&#34; cl.exe source.cpp&#34;)是:

100000/100000
133.991s

这是非常荒谬的。我想到的是VC ++正在进行不必要的刷新。

有人知道如何防止这种情况吗?

编辑:设置为:

gcc版本4.8.2(GCC),目标i686-pc-cygwin

Microsoft(R)C / C ++优化编译器版本18.00.21005.1 for x86

Windows 7 Professional N 64位,CPU i7-3630QM,2.4GHz,内置8.00GB

2 个答案:

答案 0 :(得分:9)

MSVC中的

std::cout很慢(https://web.archive.org/web/20170329163751/https://connect.microsoft.com/VisualStudio/feedback/details/642876/std-wcout-is-ten-times-slower-than-wprintf-performance-bug-in-c-library)。

  

这是我们的C和C ++标准库的一个不幸结果   实现是设计的。问题是,当打印到   控制台(而不是重定向到文件),既不是我们的C   默认情况下,也不缓冲C ++ I / O.这有时是隐藏的   事实上,C I / O暂时具有printf()和puts()的功能   在做他们的工作时启用缓冲。

Microsoft建议修复此问题(在cout / stdout上启用缓冲):

setvbuf(stdout, 0, _IOLBF, 4096)

您也可以尝试:

cout.sync_with_stdio(false);

但可能不会产生任何影响。

答案 1 :(得分:0)

避免使用std :: endl,而是使用&#34; \ n&#34;。 std :: endl应该按照标准刷新。