首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器会自动优化重复代码吗?

编译器会自动优化重复代码吗?
EN

Stack Overflow用户
提问于 2017-08-03 19:45:45
回答 3查看 136关注 0票数 2

如果我有一些简单算术的代码,它会重复几次。编译器会自动优化它吗?

下面是示例:

代码语言:javascript
复制
someArray[index + 1] = 5;
otherArray[index + 1] = 7;

从性能的角度(不是从良好的可读性和可维护性代码的角度来看),引入变量nextIndex = index + 1有意义吗?或者编译器会自动进行这样的优化吗?

EN

回答 3

Stack Overflow用户

发布于 2017-08-03 20:15:43

你不应该担心像这样的微不足道的优化,因为几乎所有的编译器都会持续10-15年或更长时间。

但是如果你在你的代码中有一个非常关键的地方,并且想要获得最大的运行速度,那么你可以检查生成的汇编代码,以确保编译器做了这个微不足道的优化。

在某些情况下,多一个算术加法可能比保存在寄存器或内存中的代码版本更快,编译器知道这一点。如果你尝试手动优化琐碎的情况,你可以让你的代码变得更慢。

你还可以使用像https://gcc.godbolt.org这样的在线服务来检查生成的代码(支持几个版本的gcc,clang,icc )。

票数 2
EN

Stack Overflow用户

发布于 2017-08-03 20:27:26

古老的格言“吸它然后看”似乎在这里是合适的。我们经常忘记,到目前为止,最常见的处理器是4/8/16位微处理器,具有奇怪而奇妙的应用程序特定架构和合适的供应商特定编译器。它们经常使用编译器扩展来“帮助”(或混淆)编译器生成“更好”的代码。

21世纪初的一款数字信号处理器在流水线中并行执行每个时钟周期8条指令(复杂的"load+increment+multiply+add+round")。这样做的前提条件是,所有内容都必须预先加载到寄存器中。这意味着寄存器显然处于溢价状态(一如既往)。在这种架构下,最好将结果绑定到空闲寄存器,并使用无法并行的空闲插槽(一些指令禁止在同一周期中使用其他指令),以便稍后重新计算它。编译器得到这个“正确”了吗?是的,它经常保留结果以供以后重用,结果是由于缺少寄存器而导致流水线停滞,从而导致执行速度变慢。

所以,你编译它,检查它,分析它等等,以确保当编译器得到“正确”时,我们可以进入并修复它。如果没有语言不支持的额外语义信息,就很难知道什么是“正确”。

结论:吸它,看看

票数 1
EN

Stack Overflow用户

发布于 2017-08-16 14:12:09

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45483248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档