@
Jooooooooo 编译器已经干了很多了,但还是比不过人类的手调优化。
当然,更细致的优化还是要用汇编来手调。
你说的那些变量用不上自动优化掉这些,C 家族编译器不知道多少年前就已经实现了。
现在的编译器已经在做远远强于你说的这些事情了。
比如之前我有一个项目,用 intrinsics 写 SIMD 汇编,用 clang 编译以后速度快得惊人,比其他编译器都要快。
后来我去仔细检查了 clang 生成的汇编代码,发现编译器直接把我写的汇编指令等价重写成了另一批指令集,而那些指令集运行速度要比我用的指令集快不少。现在的编译器开关开得多了以后,会更激进地帮你重写代码。比如说循环里顺序读写内存的指令,会被自动矢量化成 SIMD ;比如为了减少跳转,而把短小的循环 unroll 展开;等等各种。
然后在这之上,专业的优化人员可以通过检查 CPU 核心的状态,再去微调和重排指令。
比如说根据 CPU 执行流水线上某个指令周期是否在摸鱼,而把某几条顺序无关的 CPU 指令往前或者往后移动等等。当然这个在比较新的 CPU 上可能也没有什么用了,现代 CPU 都会重新译码成 uop 然后在内部重排。
左值右值的概念也会随着编译器的进步而逐渐淡出人们的视线吧。提到这些概念的地方大多也是编译器或者公理规范这些东西,只是使用的话,一把梭随便搞,一般不太会翻车的。
PS: 和 C/汇编比,Java 是真的慢……