我正在打印计算的多次迭代的进度,输出实际上是它中最慢的部分,但只有当我使用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
答案 0 :(得分:9)
这是我们的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应该按照标准刷新。