不同版本的编译器(例如GCC)是否会产生不同的性能?
Do different versions of compilers (e.g GCC) generate different performance?
我有一个问题很久了,即新版本的 C/C++ 编译器是否生成了性能更好的代码(例如 G++ 7.3 与 G++ 4.8(?
如果他们这样做,加速的来源是什么?如果没有,是否建议更新编译器?
这里有一个关于GCC的简短答案 - 在他们的主页上有一个广泛的不同基准测试结果列表。
例如,查看Charles Leggett的OOPACK基准测试的特定运行:
OOPACK 内核由 4 个程序组成,用于测量抽象数据类型的C++编译器与 C 编译器的相对性能。内核的构造方式使其可以用 C 或 C++ 编码。C 程序由C++编译器编译。
内核包括:
- Max 衡量编译器内联简单条件的能力。
- 矩阵衡量编译器传播常量和提升简单不变量的能力。
- 迭代器衡量编译器内联生存期较短的小对象的能力。
- 复杂度量编译器消除临时性的程度。
其中一条结论是:
gcc 优化的 C 在 2.91.66 和 3.x 之间有所改进
正如预期的那样,快速浏览其他一些基准似乎也支持"越新越好"的说法。
从海湾合作委员会发展使命声明中列出的"设计和开发目标"中选取类别,改进的原因分为以下三个之一:
- 新的优化
- 改进的运行时库
- 各种其他基础设施改进
需要注意的是,其他目标涉及"新语言"和"新目标"——因此新版本的相关性将取决于您的用例。
此外,阅读有关发布标准的信息 - 我警告不要通过谈论"更好的性能"来误导自己,因为编译器设计需要权衡许多:
与大多数正确性问题相反,在大多数正确性问题中,除了正确之外,任何正确都是可以接受的,因此在代码质量和编译时间之间进行行为权衡是合理的。例如,在使用优化进行编译时,如果编译器速度较慢,但生成高级代码,则可能是可以接受的。如果编译器在其他测试用例上生成了实质上优越的代码,则编译器在某些测试用例上生成劣质代码也是可以接受的。
因此,特别是对于利基和性能关键型应用程序,您可能希望比较特定的编译器版本
作为旁注,您可能会发现阅读有关其开发计划的更多信息很有趣,其中包括版本编号等说明。
是的,较新版本的 GCC 生成更好的代码并具有更好的性能。
加速来自写入 GCC 的更好的代码生成算法。
如果没有兼容性问题,我建议升级 GCC。较新的 GCC 版本具有更少的错误并生成更好的代码。
如果您升级 GCC,您可能也必须升级 Binutils。
只是需要澄清的说明,这可能不适用于任何Microsoft产品(请参阅评论(。由于我对他们没有任何经验,我不知道。然而,总的来说,GCC在每个版本中都有更少的错误和更好的代码,这就是我写我所做的的原因。
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 不同版本的编译器(例如GCC)是否会产生不同的性能?
- 在现代C++中,侵入式容器是否仍然比非侵入式容器具有性能优势?
- 与纯 V8 相比,NodeJS 是否有任何性能缺陷或显著开销?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 隐式转换函数的返回对象时是否会影响性能?
- 为数组赋值时是否存在性能差异
- 在类中始终使用此指针是否有任何性能成本
- 在渲染之前直接上传是否会对性能产生负面影响
- 我是否错过了什么,或者虚拟呼叫的性能并不像人们所说的那样糟糕
- 使用 OpenGL 窗口(如 GLFW)或周围的窗口(如 GTK 或 SDL)是否存在性能差异?
- 在将其尺寸较大的向量移动到容量较小的向量之前,是否可以通过使用Reserve()来提高代码性能
- QSqlQuery 绑定值与 BindValues 与 QString.arg() 是否存在性能差异
- 检查从查询返回的任何行是否包含在字符串中的最高性能方法?
- 在C++代码中使用纯 C 库是否有性能下降/损失
- 使用 const CString& 而不是单独使用 CString 作为函数参数是否有任何性能优势?
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- 如果多个线程使用同一对象,性能是否受到影响
- OpenCV的Python或C++编码的性能是否不同
- 当从应用程序多次调用数据库过程时,性能是否会受到影响