据说使用-O3
gcc 优化选项编译 GNU 工具和 Linux 内核会产生奇怪的 bug。这是真的吗?有人尝试过还是这只是一个骗局?
答案1
-O3
有几个缺点:
- 首先,它生成的代码通常比
-O2
或慢-Os
。有时,由于循环展开,它会产生更长的代码,实际上,由于代码的缓存性能较差,代码可能会更慢。 - 正如所说,它有时会产生错误的代码。这可能是由于优化错误或代码错误(例如忽略严格别名)。由于内核代码有时是“智能”的,有时必须是“智能的”,我想说某些内核开发人员可能犯了一些错误。当我使用当时稳定的 gcc 4.5 编译内核时,我遇到了各种奇怪的问题,例如用户空间实用程序崩溃。由于各种错误,我仍然使用 gcc 4.4 作为内核和几个选定的用户空间实用程序。同样的情况也适用于
-O3
. - 我不认为它给 Linux 内核带来太多好处。内核不进行繁重的计算,并且在某些地方进行了汇编优化。
-O3
旗帜将不是改变上下文切换的成本或 I/O 的速度。我认为整体性能加速 <0.1% 是不值得的。
答案2
在过去的 10 年里,我一直在运行多个 Gentoo 系统,其中包含 1000 多个-O3 -march=native
全球使用的软件包,但尚未遇到任何这些本-O3
应出现的神秘稳定性问题。 CPU 密集型应用程序(如数学/科学应用程序)的基准测试始终表明-O3
可以生成更快的代码,毕竟如果不这样做,那就毫无意义。对于大多数桌面应用程序来说,CFLAGS
由于它们受 IO 限制,所以并不那么重要,但对于受 CPU 限制的服务器端内容来说,这很重要。
答案3
它是在Gentoo中使用的,我没有发现任何异常。
答案4
-O3 使用一些激进的优化,只有在有关寄存器使用、堆栈帧如何交互以及函数重入性的某些假设为真时才是安全的,并且这些假设在某些代码(如内核)中不能保证为真,特别是当内联汇编时使用(因为它在内核及其驱动程序模块的一些非常低级别的部分中)。