如果我有一些代码与简单的算术,重复几次。编译器会自动优化吗?
这里的例子是:
someArray[index + 1] = 5;
otherArray[index + 1] = 7;
从性能的角度介绍变量nextIndex = index + 1
是否有意义(不是从良好的可读和可维护的代码的角度来看),或者编译器会自动进行这样的优化?
答案 0 :(得分:2)
你不应该担心像这样的微不足道的优化,因为几乎所有编译器都会持续10到15年或更长时间。
但是如果你的代码中有一个非常关键的位置并希望获得最大的运行速度,那么你可以检查生成的汇编代码以确保编译器完成了这个简单的优化。
在某些情况下,再添加一个算术可能比保存在寄存器或内存中更快的代码版本,编译器也知道这一点。如果您尝试手动优化琐碎案例,则可以使代码更慢。
您可以使用https://gcc.godbolt.org之类的在线服务来检查生成的代码(在多个版本中支持gcc,clang,icc)。
答案 1 :(得分:1)
古老的格言“吮吸它并看到”似乎在这里是合适的。我们经常忘记到目前为止最常见的处理器是4/8/16位微处理器,具有奇怪而精彩的应用程序特定架构以及适合奇怪的供应商特定编译器。它们经常具有编译器扩展,以“帮助”(或混淆)编译器生成“更好”的代码。
从2000年代早期开始,一个DSP在一个流水线中并行地每个时钟周期执行8条指令(复杂 - “加载+增量+乘法+加+圆”)。这项工作的前提条件是必须事先将所有内容预先加载到寄存器中。这意味着寄存器显然非常珍贵(一如既往)。使用这种体系结构,通常最好将结果存储到空闲寄存器并使用无法并行的空闲插槽(某些指令阻止在同一周期中使用其他指令)以便稍后重新计算。编译器是否“正确”了?是的,它经常使结果在以后重复使用,结果是由于缺少寄存器而导致管道停滞,导致执行速度变慢。
所以,你编译它,检查它,分析它等等,以确保当编译器“正确”时,我们可以进入并修复它。如果没有语言不支持的其他语义信息,很难知道“正确”是什么。
结论:吮吸它并看到
答案 2 :(得分:0)