单行语句更快吗?

时间:2017-01-31 20:01:34

标签: compiler-construction cpu compiler-optimization

这个问题完全出于好奇,我确信答案是依赖于编译器的。这也是一种极端微观优化,几乎肯定会导致无法维护的代码。 CPU显然需要执行每个计算并将其存储在某个位置,因此可能在功能上相同。

除此之外,我想知道使用较少的变量是否会导致更快的执行代码。例如,它会知道将结果留在寄存器中以进行长时间的计算。当然,如果您不止一次需要相同的结果,这没有帮助。

例如这段代码:

var result = GetNumber();
var adjusted1 = result + 10;
var adjusted2 = adjusted1/2;
var final = GetFinal(adjusted2);

可以转换成以下内容:

var final = GetFinal((GetNumber() + 10)/2);

一般情况下编译器会输出类似这样的内容,单行没有变量,在各种语言中总是相同的吗?如果上面的陈述涉及100次计算会是一样的吗?

2 个答案:

答案 0 :(得分:2)

问题实际上是编译器特定的,而不是特定于语言的。由于任何给定的语言可能有任何数量的编译器,其中一些尚未编写,因此无法提供一般性答案。

如果可能,大多数编译器会自动删除不必要的本地临时变量。显然,值需要存储在传递的某个地方,但是可能不需要将它存储在主存储器中,除非稍后在程序中引用它,即使这样它仍然可以在寄存器中存在。这种优化相对简单,所以我希望它能由任何进行任何优化的编译器完成。

即使编译器没有在这里进行优化,硬件也可以通过并行存储来提供帮助。即使编译器写入并立即从主存储器中读取值,处理器也可能会从缓存中获取它,这只会比寄存器访问稍慢。

有些语言会禁止这种优化,因为变量是神圣的,或者更加长篇,因为语言的语义允许内省或运行时解释(例如,使用eval内置函数)。在这种情况下,变量必须存在,即使它没有被明显引用,因为内省或动态评估的某些使用可能会引用它。这也意味着创建变量是一项非常重要的操作,因为它意味着将它们的名称存储在某种持久性数据结构中。但是:这种类型的语言很少被编译,因此整个程序可能会遇到比额外变量的成本更重要的解释开销。

总的来说,你应该以一种让他们最容易理解的方式编写程序。这将帮助您避免错误,帮助其他人理解您的代码,甚至帮助编译器找到最佳优化。担心优化的微不足道的细节几乎不是大脑努力的有用支出。相反,专注于为每项任务找到最佳算法。

答案 1 :(得分:1)

根据您提到的语言和编译器,编译器有时会为您优化代码。在今天的世界里,你真的不会注意到你的例子之间的区别。更重要的是,代码的可维护性和可读性。除非您正在进行一些算法开发和数十万次迭代,或者在每毫秒计算的嵌入式处理器上,否则您不会从后者中获益。分支预测和缓存未命中可能是不同的情况。