C++、MinGW、Windows:使用std::cout打印数字的速度非常慢



我刚买了一台新笔记本电脑,安装了MinGW后,简单程序的执行时间非常糟糕。下面是我写的一个简单的for循环。

#include <iostream>
using namespace std;
int main()
{
for(int i=0;i<10000;i++)
{
cout<<i<<endl;
}
return 0;
}

在我的笔记本电脑上,ryzen 9 4000 cpu运行Windows,执行耗时18.9秒。我尝试过使用不同的IDE并重新安装MinGW,但同样的问题仍然存在。

关于如何让这次跑步更快,有什么想法吗?

GCC或clang(因此使用MinGW进行设置(

应用评论中的建议:

  • 最重要的是:使用std::ios_base::sync_with_stdio(false);,原因如下。如果不这样做,就会产生同步开销。如果您只使用您可能想要的c++流,则不需要此同步。如果不这样做,它将阻止行缓冲,原因如下
  • 使用'n'而不是std::endlstd::endl刷新流。这会减慢速度。(注意:这很可能只有在将输出重定向到文本文件时才会产生效果。当打印到终端时,流很可能是行缓冲的(或者可能完全没有缓冲(。在这种情况下,这没有什么区别,打印换行符也会导致流被刷新(
  • 调用编译器时启用-Og(适合调试的优化(或-O3(完全优化((请参阅编译器的优化文档,例如GCC的本页(

然后,你会得到这个程序:

#include <iostream>
int main()
{
std::ios_base::sync_with_stdio(false);
for(int i = 0; i < 10000; ++i) {
std::cout << i << 'n';
}
return 0;
}

当打印到windows命令行时,你发布的代码在我的windows10机器上运行了7秒。当在没有优化的情况下编译时,这将在几毫秒(可能是一百毫秒(内运行,而当在有优化的情况中编译时,它将在不到50ms的时间内运行。对我来说,大部分变化来自sync_with_stdio调用。

MSVC

默认情况下,即使在调用std::ios_base::sync_with_stdio(false);之后,MSVC也会完全取消std::cout缓冲区。在这里,使用(如链接文章中所建议的((用于setvbuf的文档(:手动设置要行缓冲的流是有帮助的

setvbuf(stdout, 0, _IOLBF, 4096)

相关内容

  • 没有找到相关文章

最新更新