我正在打印多次计算迭代的进度,输出实际上是其中最慢的部分,但只有当我使用 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 年 11 月(“cl.exe source.cpp”)编译时得到的输出是:
100000/100000
133.991s
这是相当荒谬的。我想到的是 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 RAM
std::cout
在 MSVC 中很慢(https://web.archive.org/web/20170329163751/https://connect.microsoft.com/VisualStudio/feedback/details/642876/std-wcout-is-ten-times-slower-than-wprintf-performance- C 库中的错误 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);
但可能不会有什么不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)