不同版本的编译器(例如 GCC)会产生不同的性能吗?

Zhi*_*Cui 2 c c++ optimization g++ compiler-optimization

我有一个很长一段时间的问题,即新版本的C/C++编译器是否会生成性能更好的代码(例如G++ 7.3 vs G++ 4.8)?

如果他们这样做,加速的来源是什么?如果没有,是否建议更新编译器?

gst*_*gst 7

这是关于 GCC 的简短回答——在他们的主页上有大量不同的基准测试结果列表。

例如,查看Charles Leggett对 OOPACK 基准测试的特定运行:

OOPACK 内核由 4 个程序组成,用于测量抽象数据类型的 C++ 编译器与 C 编译器的相对性能。内核的构造方式使其可以用 C 或 C++ 进行编码。C 程序由 C++ 编译器编译。

内核包括:

  • Max 衡量编译器内联简单条件的程度。
  • 矩阵衡量编译器传播常量和提升简单不变量的程度。
  • 迭代器衡量编译器内联短期小对象的程度。
  • Complex 衡量编译器消除临时变量的程度。

其中一项结论如下:

gcc 优化的 C 在 2.91.66 和 3.x 之间有所改进

正如预期的那样,快速浏览其他一些基准似乎也支持“越新越好”的说法。

GCC 发展使命声明中列出的“设计和发展目标”中的类别来看,改进的原因属于以下三个之一:

  • 新的优化
  • 改进的运行时库
  • 各种其他基础设施改进

重要的是要注意其他目标涉及“新语言”和“新目标”——因此新版本的相关性将取决于您的用例。

此外,阅读发布标准——我警告不要通过谈论“更好的性能”来误导自己,因为编译器设计有许多权衡:

与大多数正确性问题相比,只有正确是可以接受的,为了代码质量和编译时间而权衡行为是合理的。例如,在优化编译时,如果编译器速度较慢,但​​生成优质代码,这可能是可以接受的。如果编译器在其他测试用例上生成了非常优秀的代码,那么它在某些测试用例上生成劣质代码也是可以接受的。

因此,特别是对于利基和性能关键的应用程序,您可能想要比较特定的编译器版本


作为旁注,您可能会发现阅读更多关于他们的开发计划的信息很有趣,其中包括对版本编号等的解释。