1

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

someFunction( x+2 );

对比

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

那么函数呢?

someFunction( someOtherFunction() );
4

4 回答 4

2

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

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

写出来便于阅读。不要担心这些东西。

于 2012-08-22T16:53:26.167 回答
2

很明显:创建一个变量会创建一个变量。这会消耗内存并在执行时消耗一些时间。之后,它要么需要时间来垃圾收集它,要么在你的函数泄漏时不释放内存。

但是,您不会注意到任何差异。在那个级别上,性能是无法衡量的。经验法则:当你真正需要变量或当它们提高代码的可读性时使用它们。

于 2012-08-22T16:54:40.647 回答
1

尽管差异很小,但答案确实是特定于实现的;JavaScript 引擎在分配事物的方式上几乎肯定是不同的。但是,我可以告诉您,这些差异很可能与大多数其他语言中的差异相似,我可以在调试器中检查内存和处理器寄存器。让我们研究一种情况:

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

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

someFunction(x+2);

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

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

总而言之:

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

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

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

这主要是个人喜好问题。

于 2012-08-22T17:00:08.103 回答
0

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

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

  1. 可读性:命名表达式的结果是否使表达式正在计算的内容更清晰;

  2. 评估表达式的成本:如果您将多次编写表达式,那么将变量绑定到结果将您可以重用,避免每次都重新计算结果。当您的表达式预计需要很长时间才能计算时,这才有意义。

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

于 2012-08-22T17:23:52.177 回答