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)
但可能它不会有所作为.