非常慢的std::cout使用MS编译器
Extremely slow std::cout using MS Compiler
我正在打印一个计算的多次迭代的进度,输出实际上是它最慢的部分,但只有当我使用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应该刷新
- 为什么我不能在同一 MS VS 解决方案中的两个控制台应用中使用C++特征(仅标头库)?
- 使用 MS 绕道挂钩在调用钩子函数时崩溃C++
- 如何使用MS CryptoAPI导出受密码保护的私钥
- 使用 MFC C++ 6.0 从 ms 访问中读取整数数据
- 如何更改样本计数或使用GPROF进行频率?10.0 ms太多的ubuntu.c
- 在MS Visual Studio 2010上使用带有Cuda互操作的OpenGL缓冲区时出现异常错误
- Poco C++与使用ODBC的MS SQL
- 是否可以使用现有API修改windows功能区控件,使其看起来更像MS Word 2010中的功能区
- 使用 search-ms: 或 search: 协议将搜索结果作为 IShellItem 进行检索
- 如何使用 wxDataViewListCtrl 实现 MS-Excel 行为
- 使用堆调试 MS VC++ 2005
- 如何使用 c++ 计算 ms word 97-2003 doc 文件的字数
- 使用MS Test的函数TestMockedTRHUStart(void)中引用的未解析外部符号xxx
- D3DXCreateTexture在使用MS "Application verifier"运行时失败
- 除非先使用MS Paint打开/保存文件,否则带有QRCode位图的LoadImage()将失败
- 开发使用MS CryptoAPI的64位应用程序
- 单个迭代使用MS concurrency::parallel_for()的性能
- 从头开始-我应该使用(MS Visual Studio)C#还是(MS Visual Studio)C++
- 非常慢的std::cout使用MS编译器
- 如何在Qt中使用ms访问