单行语句更快吗?
Are single line statements faster?
这个问题纯粹是出于好奇,我相信答案取决于编译器。这也是一种极端的微优化,几乎肯定会导致无法维护的代码。 CPU 显然需要执行每个计算并将其存储在某个地方,所以可能在功能上是相同的。
抛开所有这些,我想知道使用更少的变量是否会固有地导致更快的代码执行。例如,它会知道将结果留在寄存器中以进行长时间计算。当然,如果您不止一次需要相同的结果,这就没有帮助了。
例如这段代码:
var result = GetNumber();
var adjusted1 = result + 10;
var adjusted2 = adjusted1/2;
var final = GetFinal(adjusted2);
可以转化为:
var final = GetFinal((GetNumber() + 10)/2);
一般来说,编译器输出这样的东西,没有变量的单行,在不同语言之间总是相同的吗?如果上面的语句涉及100的计算是否相同?
根据您提到的语言和编译器,编译器有时会为您优化代码。在当今世界,您真的不会注意到示例之间的区别。更重要的是代码的可维护性和可读性。除非你正在做一些算法开发和数十万次迭代,或者在每一毫秒都很重要的嵌入式处理器上,否则你不会从后者中获得太多好处。分支预测和缓存未命中可能是不同的情况。
问题真的是compiler-specific,不是language-specific。而且由于任何给定的语言都可能有任意数量的编译器,其中一些尚未编写,因此无法提供一般性答案。
如果可能,大多数编译器会自动删除不必要的局部临时变量。显然这个值需要存储在某个地方,但可能不需要将它存储在主内存中,除非它在程序的后面被引用,即使这样它可能仍然可以在寄存器中使用。这种优化相对简单,所以我希望它可以由任何进行任何优化的编译器完成。
即使编译器未在此处进行优化,硬件也可能会通过并行执行存储来提供帮助。即使编译器写入并立即从主内存读取值,处理器也可能会从缓存中获取它,这只会比寄存器访问稍慢。
有些语言禁止这种优化,因为变量是神圣的,或者更世俗地说,因为语言的语义允许内省或运行时解释(例如,使用 eval
内置函数)。在那种情况下,变量必须存在,即使它没有被明显地引用,因为一些内省或动态评估的使用可能会引用它。这也意味着创建变量是一个 non-trivial 操作,因为这意味着将它们连同它们的名称存储在某种持久数据结构中。然而:这种类型的语言很少被编译,所以整个程序可能遭受解释开销比额外变量的成本要大得多。
总的来说,你应该以最容易理解的方式编写程序。这将帮助您避免错误,帮助其他人理解您的代码,甚至帮助编译器找到最佳优化。担心优化的琐碎细节几乎不会浪费脑力。相反,专注于为每项任务寻找最佳算法。
这个问题纯粹是出于好奇,我相信答案取决于编译器。这也是一种极端的微优化,几乎肯定会导致无法维护的代码。 CPU 显然需要执行每个计算并将其存储在某个地方,所以可能在功能上是相同的。
抛开所有这些,我想知道使用更少的变量是否会固有地导致更快的代码执行。例如,它会知道将结果留在寄存器中以进行长时间计算。当然,如果您不止一次需要相同的结果,这就没有帮助了。
例如这段代码:
var result = GetNumber();
var adjusted1 = result + 10;
var adjusted2 = adjusted1/2;
var final = GetFinal(adjusted2);
可以转化为:
var final = GetFinal((GetNumber() + 10)/2);
一般来说,编译器输出这样的东西,没有变量的单行,在不同语言之间总是相同的吗?如果上面的语句涉及100的计算是否相同?
根据您提到的语言和编译器,编译器有时会为您优化代码。在当今世界,您真的不会注意到示例之间的区别。更重要的是代码的可维护性和可读性。除非你正在做一些算法开发和数十万次迭代,或者在每一毫秒都很重要的嵌入式处理器上,否则你不会从后者中获得太多好处。分支预测和缓存未命中可能是不同的情况。
问题真的是compiler-specific,不是language-specific。而且由于任何给定的语言都可能有任意数量的编译器,其中一些尚未编写,因此无法提供一般性答案。
如果可能,大多数编译器会自动删除不必要的局部临时变量。显然这个值需要存储在某个地方,但可能不需要将它存储在主内存中,除非它在程序的后面被引用,即使这样它可能仍然可以在寄存器中使用。这种优化相对简单,所以我希望它可以由任何进行任何优化的编译器完成。
即使编译器未在此处进行优化,硬件也可能会通过并行执行存储来提供帮助。即使编译器写入并立即从主内存读取值,处理器也可能会从缓存中获取它,这只会比寄存器访问稍慢。
有些语言禁止这种优化,因为变量是神圣的,或者更世俗地说,因为语言的语义允许内省或运行时解释(例如,使用 eval
内置函数)。在那种情况下,变量必须存在,即使它没有被明显地引用,因为一些内省或动态评估的使用可能会引用它。这也意味着创建变量是一个 non-trivial 操作,因为这意味着将它们连同它们的名称存储在某种持久数据结构中。然而:这种类型的语言很少被编译,所以整个程序可能遭受解释开销比额外变量的成本要大得多。
总的来说,你应该以最容易理解的方式编写程序。这将帮助您避免错误,帮助其他人理解您的代码,甚至帮助编译器找到最佳优化。担心优化的琐碎细节几乎不会浪费脑力。相反,专注于为每项任务寻找最佳算法。