极慢的std :: cout使用MS Compiler

Ada*_*eck 4 c++ performance cout visual-c++

我正在打印计算的多次迭代的进度,输出实际上是它的最慢部分,但只有当我使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

100000/100000 
0.428025s
Run Code Online (Sandbox Code Playgroud)

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

100000/100000
133.991s
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:设置是:

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

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

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

man*_*lio 10

std::cout在MSVC中很慢(http://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都不会被缓冲.这有时会被像printf()和puts()这样的CI/O函数暂时启用缓冲这一事实所掩盖.

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

setvbuf(stdout, 0, _IOLBF, 4096)
Run Code Online (Sandbox Code Playgroud)

你也可以尝试:

cout.sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)

但可能它不会有所作为.