gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:21 28 4
gpt4 key购买 nike

我正在打印多次计算迭代的进度,输出实际上是其中最慢的部分,但只有当我使用 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

Microsoft (R) C/C++ 优化编译器版本 18.00.21005.1 for x86

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

最佳答案

MSVC 中的

std::cout 很慢 ( 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 )。

It is an unfortunate consequence of how our C and C++ Standard Library implementations are designed. The problem is that when printing to the console (instead of, say, being redirected to a file), neither our C nor C++ I/O are buffered by default. This is sometimes concealed by the fact that C I/O functions like printf() and puts() temporarily enable buffering while doing their work.

Microsoft 建议此修复(以在 cout/stdout 上启用缓冲):

setvbuf(stdout, 0, _IOLBF, 4096)

你也可以试试:

cout.sync_with_stdio(false);

但可能不会有什么不同。

关于c++ - 使用 MS 编译器的 std::cout 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22633665/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com