非常慢的std::cout使用MS编译器

Extremely slow std::cout using MS Compiler

本文关键字:使用 MS 编译器 cout 非常 std      更新时间:2023-10-16

我正在打印一个计算的多次迭代的进度,输出实际上是它最慢的部分,但只有当我使用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 ("g++ source.cpp -std==c++11")编译得到的输出是:

100000/100000 
0.428025s

现在我得到的输出与Visual c++编译器十一月2013 ("cl.exe source.cpp")编译时是:

100000/100000
133.991s

这很荒谬。想到的是vc++正在执行不必要的刷新。

有谁知道怎么预防吗?

编辑:设置是:

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

Microsoft (R) C/c++ optimization Compiler Version 18.00.21005.1 for x86

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

std::cout in MSVC是慢的(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被缓冲。这有时是由像printf()和puts()这样的C I/O函数是临时的在工作时启用缓冲

Microsoft建议这个修复(启用cout/stdout缓冲):

setvbuf(stdout, 0, _IOLBF, 4096)

你也可以试试:

cout.sync_with_stdio(false);

但可能不会有什么不同

避免使用std::endl,而是使用"n"。根据标准,Std::endl应该刷新