我刚买了一台新笔记本电脑,安装了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::endl
。std::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)