与 GCC 5 相比,使用 GCC 9 编译的 STLpriority_queue 性能较慢

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 慢?也许我应该使用一些编译器标志?先感谢您!

Ted*_*gmo 6

这并不意味着是一个答案,但由于我有一些可用的 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秒

  • 当然,您的 CPU *不是* Nehalem...它是 Skylake,其中微代码更新引入了一些性能缺陷。如果发生紧密循环,则需要编译器来解决它:[如何减轻 Intel jcc 勘误表对 gcc 的影响?](/sf/ask/4287965251/) (2认同)