如果我有一些简单算术的代码,它会重复几次。编译器会自动优化它吗?
下面是示例:
someArray[index + 1] = 5;
otherArray[index + 1] = 7;从性能的角度(不是从良好的可读性和可维护性代码的角度来看),引入变量nextIndex = index + 1有意义吗?或者编译器会自动进行这样的优化吗?
发布于 2017-08-03 20:15:43
你不应该担心像这样的微不足道的优化,因为几乎所有的编译器都会持续10-15年或更长时间。
但是如果你在你的代码中有一个非常关键的地方,并且想要获得最大的运行速度,那么你可以检查生成的汇编代码,以确保编译器做了这个微不足道的优化。
在某些情况下,多一个算术加法可能比保存在寄存器或内存中的代码版本更快,编译器知道这一点。如果你尝试手动优化琐碎的情况,你可以让你的代码变得更慢。
你还可以使用像https://gcc.godbolt.org这样的在线服务来检查生成的代码(支持几个版本的gcc,clang,icc )。
发布于 2017-08-03 20:27:26
古老的格言“吸它然后看”似乎在这里是合适的。我们经常忘记,到目前为止,最常见的处理器是4/8/16位微处理器,具有奇怪而奇妙的应用程序特定架构和合适的供应商特定编译器。它们经常使用编译器扩展来“帮助”(或混淆)编译器生成“更好”的代码。
21世纪初的一款数字信号处理器在流水线中并行执行每个时钟周期8条指令(复杂的"load+increment+multiply+add+round")。这样做的前提条件是,所有内容都必须预先加载到寄存器中。这意味着寄存器显然处于溢价状态(一如既往)。在这种架构下,最好将结果绑定到空闲寄存器,并使用无法并行的空闲插槽(一些指令禁止在同一周期中使用其他指令),以便稍后重新计算它。编译器得到这个“正确”了吗?是的,它经常保留结果以供以后重用,结果是由于缺少寄存器而导致流水线停滞,从而导致执行速度变慢。
所以,你编译它,检查它,分析它等等,以确保当编译器得到“正确”时,我们可以进入并修复它。如果没有语言不支持的额外语义信息,就很难知道什么是“正确”。
结论:吸它,看看
发布于 2017-08-16 14:12:09
https://stackoverflow.com/questions/45483248
复制相似问题