Ale*_*ika 11 c++ performance gcc priority-queue compiler-optimization
对于我的项目,我从 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;
}
Run Code Online (Sandbox Code Playgroud)
当我使用 GCC 5 编译它时,我得到以下计时:
# g++-5 -std=c++14 -O3 main.cpp
# time ./a.out
real 0m1.580s
user 0m1.578s
sys 0m0.001s
Run Code Online (Sandbox Code Playgroud)
对 GCC 9 做同样的事情我得到:
# g++-9 -std=c++14 -O3 main.cpp
# time ./a.out
real 0m2.292s
user 0m2.288s
sys 0m0.003s
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,GCC 9 给出的结果较慢。
我不确定问题是否出在 STLpriority_queue 本身。我尝试了 boostpriority_queue 并得到了相同的结果。
有谁知道为什么这个应用程序的性能在 GCC 9 上比 GCC 5 慢?也许我应该使用一些编译器标志?先感谢您!
这并不意味着是一个答案,但由于我有一些可用的 g++ 工具链,我进行了一些测试运行,看看我是否能看到关于这种感知退化的一些有趣的东西。
最大的放缓似乎在 6.2 到 7.2 之间。也许这张表可以让人们回忆起可能的原因。
自从我开始使用 gcc 4 以来,我就使用了 C++11,所以在除了第一个之外的所有情况下,我都使用了g++ -std=c++11 -O3 main.cpp
.
g++版本 | 真实的 | 用户 | 系统 |
---|---|---|---|
4.5.0 (-std=c++0x) |
0米1.711秒 | 0米1.701秒 | 0米0.004秒 |
4.8.5 | 0米1.673秒 | 0米1.667秒 | 0米0.002秒 |
5.1.0 | 0米1.586秒 | 0米1.578秒 | 0米0.002秒 |
6.2.0 | 0米1.775秒 | 0米1.766秒 | 0米0.003秒 |
7.2.0 | 0m2.192s | 0m2.176s | 0米0.003秒 |
8.2.0 | 0m2.192s | 0m2.186s | 0米0.000秒 |
9.3.0 | 0m2.122s | 0m2.114s | 0米0.001秒 |
10.2.0 | 0m2.308s | 0m2.299s | 0米0.002秒 |
11.3.0 | 0m2.293s | 0m2.285s | 0米0.002秒 |
12.1.0 | 0m2.306s | 0m2.299s | 0米0.001秒 |