2012-08-22 58 views
1

将参数作为表达式传递,而不是首先将其作为变量,会有任何性能问题吗?变量vs表达式为Javascript参数

someFunction(x+2); 

var total = x+2; 
someFunction(total); 

又有怎样的功能呢?

someFunction(someOtherFunction()); 
+0

让我们看看:http://jsperf.com/var-vs-expression。差异似乎在误差范围内。 –

回答

1

虽然差异很小,但答案实际上是特定于实施的; JavaScript引擎的分配方式几乎肯定不同。但是,我可以告诉你,最有可能的差异与我可以在调试器中检查内存和处理器寄存器的大多数其他语言中的差异类似。让我们来看一个场景:

var sum = x+2; 
someFunction(sum); 

这分配内存来保存总和,只要功能在范围内,它就会挂起。如果函数最终成为闭包,这可能是永远的。在递归函数中,这可能很重要。

someFunction(x+2); 

在大多数语言中,这将在堆栈上计算x + 2并将结果传递给someFunction。没有记忆留下来。

答案对于函数返回值完全相同。

因此,在总结:

  1. 确切的答案取决于JavaScript引擎的实现。

  2. 最有可能你不会注意到性能差异。

  3. 您可能希望在重用结果时使用变量,或者希望在调试器中轻松检查结果。

这主要是个人喜好的问题。

+0

'sum'变量的内存不会在堆栈上吗? – Chuck

+0

这是一个实现特定的细节;在大多数情况下,特别是关闭时,我怀疑它不会保留在堆栈中。 –

2

不,更重要的是,这种微观优化(几乎可以肯定)没有意义。尽管如此,如果您不止一次地使用表达式的结果,那么可能会有一些完全不可察觉的和完全不值得担心的 - 关于保存计算结果的好处。

将其写入可读。不要担心这个东西。

2

只是显而易见:做一个变量创建一个变量。这会消耗内存并在执行时耗费一些时间。之后,它将需要时间来垃圾回收,或者如果你的功能泄漏,则不会释放内存。

但是,您不会注意到任何差异。这一级别的表现无法衡量。经验法则:当你真的需要它们或者当他们提高你的代码的可读性时使用变量。

0

创建局部变量的范围不超出当前函数的局部变量与不创建任何代价相比,不会产生任何代价,并且不会直接将该表达式作为参数写入函数。事实上,没有什么可以告诉你,编写someFunction(x*2)不会被转换成代码,它将JavaScript变量绑定到内部由JavaScript编译器产生的结果 - 事实上,许多编译器和JIT使用SSA作为它们的中间表示之一,其中形式变量是总是绑定到每个子表达式的结果。请参阅相关Wikipedia entry。无论是否关闭都没有区别。

应该关心你,使引入新的变量,并直接写入表达式作为参数之间的选择只有两个相关的问题是:

  1. 可读性:没有命名的表达式的结果使表达式计算更清晰;

  2. 评估表达式的代价:如果您要多次写入表达式,然后将变量绑定到结果中,您可以重复使用,避免每次都重新计算结果。这是只有相关如果您的表情预计需要很长时间来计算。

如果你只需要一次写一个函数的定义,然后结合结果的变量中的表达可能使结果活在记忆时间比是绝对必要的,但是这是几乎总是完全无关:最函数调用非常短暂,在许多情况下,结果不会占用太多内存,分配给堆栈的内存将在函数退出时被回收,并且堆中分配的内存将很快由垃圾回收器回收。