变量和表达式作为Javascript参数

时间:2012-08-22 16:52:08

标签: javascript performance arguments

将参数作为表达式传递是否存在任何性能问题,而不是首先将其作为变量?

someFunction( x+2 );

VS

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

功能怎么样?

someFunction( someOtherFunction() );

4 个答案:

答案 0 :(得分:2)

没有。更重要的是,这种微观优化(几乎可以肯定)毫无意义。

话虽如此,如果你不止一次地使用表达式的结果,那么保存计算结果可能会有一些完全不易察觉且完全不值得担心的好处。

将其写为可读。不要担心这些东西。

答案 1 :(得分:2)

显而易见:创建变量会创建一个变量。这会花费内存并在执行时消耗一些时间。之后,要么需要时间来垃圾收集它,要么在你的功能泄漏时不释放内存。

但是,您不会发现任何差异。该级别的绩效无法衡量。经验法则:当您真正需要变量或者提高代码的可读性时使用变量。

答案 2 :(得分:1)

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

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

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

someFunction(x+2);

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

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

总结如下:

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

  2. 您很可能不会注意到性能差异。

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

  4. 这主要取决于个人偏好。

答案 3 :(得分:0)

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

在引入新变量和将表达式直接写为参数之间做出选择时,唯一需要考虑的两个相关问题是:

  1. 可读性:确定表达式的结果,使表达式的计算更清晰;

  2. 评估表达式的成本:如果您要多次编写表达式,然后将变量绑定到结果将重复使用,以避免每次重新计算结果。如果您的表达式需要很长时间才能计算,那么相关。

  3. 如果你只需要在函数定义中编写一次表达式,那么将变量绑定到结果可能会使结果在内存中的存活时间超过严格必要的时间,但这几乎总是完全不相关的:大多数函数调用都非常在很多情况下,结果不会占用太多内存,并且在函数退出时将回收堆栈上分配的内存,并且很快就会由垃圾收集器回收堆上分配的内存。