对于我的项目,我从GCC 5切换到GCC 9,发现性能变差了。我做了一些调查,并提出了一个简单的源代码,重现了这种行为。
我在同一台机器上使用不同的GCC版本(g++-5和g++-9)编译代码
#include <queue>
int main()
{
std::priority_queue<int> q;
for (int j = 0; j < 2000; j ++) {
for (int i = 0; i < 20000; i ++) {
q.emplace(i);
}
for (int i = 0; i < 20000; i ++) {
q.pop();
}
}
return 0;
}
当我使用GCC 5编译它时,我得到以下计时:
# g++-5 -std=c++14 -O3 main.cpp
# time ./a.out
real 0m1.580s
user 0m1.578s
sys 0m0.001s
用GCC 9做同样的事情,我得到:
# g++-9 -std=c++14 -O3 main.cpp
# time ./a.out
real 0m2.292s
user 0m2.288s
sys 0m0.003s
如您所见,GCC 9给出的结果较慢。
我不确定问题是否出在STL priority_queue本身,我尝试了Boost priority_queue,得到了同样的结果。
有没有人知道为什么GCC 9的性能比GCC 5慢?也许我应该使用一些编译器标志?提前谢谢!
1条答案
按热度按时间9lowa7mx1#
这并不是一个答案,但由于我有一些g工具链可用,我做了一些测试运行,看看我是否可以看到一些有趣的关于这个感知到的退化。
最大的放缓似乎在6.2和7.2之间。也许这个表格可以触发某人回忆可能的原因。
自从我开始使用gcc 4以来,我一直使用C11,所以除了第一种情况之外,我在所有情况下都使用
g++ -std=c++11 -O3 main.cpp
。| g版本|真实的|使用者|系统|
| - -|- -|- -|- -|
| 4.5.0(-标准=c0x)| 0m1.711s | 0m1.701s | 0m0.004s |
| 四、八、五| 0m1.673s | 0m1.667s | 0m0.002s |
| 第5.1.0节| 0m1.586s | 0m1.578s | 0m0.002s |
| 第6.2.0节| 0m1.775s | 0m1.766s | 0m0.003s |
| 7.2.0版| 0m2.192s | 0m2.176s | 0m0.003s |
| 第8.2.0节| 0m2.192s | 0m2.186s | 0m0.000s |
| 第9.3.0节| 0m2.122s | 0m2.114s | 0m0.001s |
| 第10.2.0节| 0m2.308s | 0m2.299s | 0m0.002s |
| 第11.3.0节| 0m2.293s | 0m2.285s | 0m0.002s |
| 第12.1.0节| 0m2.306s | 0m2.299s | 0m0.001s |