G++ GNU C和x2B的优化级别表+;编译器g++;,精确的

G++ GNU C和x2B的优化级别表+;编译器g++;,精确的,g++,compiler-optimization,G++,Compiler Optimization,虽然我知道每个项目都是不同的场景,但考虑到下表,我有一个相当具体的问题 GNU C++编译器的优化级别 g++< /COD> Ox正在优化的内容EXEC code MEM COMP 时间大小时间 ------------------------------------------------------------------------------ O0优化编译时间|++-- O1优化代码大小和执行时间#1 |-++ O2优化代码大小和执行时间#2 |--0+++ O3优化代码大小和执行时间

虽然我知道每个项目都是不同的场景,但考虑到下表,我有一个相当具体的问题


GNU C++编译器的优化级别<代码> g++< /COD>
Ox正在优化的内容EXEC code MEM COMP
时间大小时间
------------------------------------------------------------------------------
O0优化编译时间|++--
O1优化代码大小和执行时间#1 |-++
O2优化代码大小和执行时间#2 |--0+++
O3优化代码大小和执行时间#3|--0++++
使用快速非精确数学计算的AST O3 |--0++++
操作系统优化代码大小| 0--0++
+增加++增加更多++增加更多-减少-减少更多-减少更多


我使用的是8.2版,不过这应该是一个从纯文本中提取并重新写入的通用表


我的问题是,如果它是可信的,我不知道那个网站,所以我最好问问这里的专业人士。那么,这张表是准确还是不准确呢?

你的表非常准确

请注意,GCC有无数的。一些奇怪的优化过程甚至在
-O3
上都没有启用(但GCC有数百个优化过程)

但是没有比
-O3
优化更能保证代码总是比使用
-O2
编译的代码运行得更快。通常情况是这样,但并非总是如此。您可能会发现病态(或只是)怪异的C源代码,当使用
-O3
编译时,与使用
-O2
编译的相同C源代码相比,它给出的二进制代码稍微慢一些。例如,
-O3
可能比
-O2
更好,至少“更多”,但如果其中的某个特定循环展开得更多,则某些代码的性能可能会更差。该网站和其他网站正在对GCC进行基准测试,并正在观察这种现象

请注意,优化是一门艺术,它通常是一个难以解决或无法确定的问题,而且当前的处理器非常复杂,没有精确完整的性能模型(想想缓存、分支预测器、管道、无序执行)。此外,x86处理器的详细微体系结构显然不是公开的(你无法获得英特尔或AMD芯片的VHDL或芯片布局)。因此,GCC的
-march=
选项也很重要(相同的二进制代码在AMD和Intel芯片上,甚至在几个品牌的Intel处理器上并不总是好的)。因此,如果在运行代码的同一台机器上编译代码,建议在
-O2
-O3
之外再传递
-march=native

由英特尔和AMD支付费用的人积极参与,但他们不被允许在内部分享他们对英特尔或AMD芯片的所有知识。允许他们共享(使用GCC的GPLv3+许可证)他们为GCC编译器贡献的源代码。也许AMD的工程师们正在观察英特尔提供的GCC代码来猜测英特尔芯片的微结构细节,反之亦然

英特尔或AMD的兴趣显然包括使GCC与他们的专有芯片配合良好。公司利益证明,支付(英特尔和AMD)几名高素质的编译器工程师为GCC全职工作是合理的

在实践中,我观察到AMD和Intel的工程师都在“玩”开源游戏:他们经常贡献GCC代码,这也提高了竞争对手的性能。这与其说是一个技术问题,不如说是一个社会、道德和经济问题


另外,你可以找到许多关于开源经济学的书籍。

你的表格非常准确

请注意,GCC有无数的。一些奇怪的优化过程甚至在
-O3
上都没有启用(但GCC有数百个优化过程)

但是没有比
-O3
优化更能保证代码总是比使用
-O2
编译的代码运行得更快。通常情况是这样,但并非总是如此。您可能会发现病态(或只是)怪异的C源代码,当使用
-O3
编译时,与使用
-O2
编译的相同C源代码相比,它给出的二进制代码稍微慢一些。例如,
-O3
可能比
-O2
更好,至少“更多”,但如果其中的某个特定循环展开得更多,则某些代码的性能可能会更差。该网站和其他网站正在对GCC进行基准测试,并正在观察这种现象

请注意,优化是一门艺术,它通常是一个难以解决或无法确定的问题,而且当前的处理器非常复杂,没有精确完整的性能模型(想想缓存、分支预测器、管道、无序执行)。此外,x86处理器的详细微体系结构显然不是公开的(你无法获得英特尔或AMD芯片的VHDL或芯片布局)。因此,GCC的
-march=
选项也很重要(相同的二进制代码在AMD和Intel芯片上,甚至在几个品牌的Intel处理器上并不总是好的)。因此,如果在运行代码的同一台机器上编译代码,建议在
-O2
-O3
之外再传递
-march=native

由英特尔和AMD支付费用的人积极参与,但他们不被允许在内部分享他们对英特尔或AMD芯片的所有知识。允许他们共享(使用GCC的GPLv3+许可证)他们为GCC编译器贡献的源代码。也许AMD的工程师们正在观察英特尔提供的GCC代码以进行猜测