JavaScript内部功能和性能

5 javascript performance closures

对定义clousre与全局范围函数的运行时和内存有什么影响?

function a(){
      //functions (option A)
}
//functions(option B)
Run Code Online (Sandbox Code Playgroud)

我知道选项A具有功能范围(闭包)的优势......

让我说我有1000个功能,这会如何影响运行时间和内存?

Lia*_*eng 6

表现

一个非常小的基准案例:

#1 内部函数:http://jsfiddle.net/bMHgc/

#2 外部函数:http://jsfiddle.net/sAVZn/

在我的机器上:(5000 * 1000次)

#1 - 700 毫秒

#2 - 80 毫秒

记忆

他们几乎是一样的...

如果可能的话,我会推荐选项 A,因为它可以使您的代码更简洁。

  • 使用 jsperf 进行基准测试。我认为选项 A 会让你的代码更干净。而且一个数量级也不是“几乎相同” (2认同)
  • 这些不是相同的测试用例。您的第一个测试用例是为每次迭代创建一个新函数,而您的第二个测试用例则不是。 (2认同)
  • 10 年后,我不得不将代码修改为 500000*1000 - 并且两个测试的运行时间相似,约为 1000 毫秒。 (2认同)

Mik*_*ola 5

如果您使用内部函数,则运行时必须为任何未来调用分配和保存它们的上下文,并且每次包含它们的函数被调用时都会发生这种情况。因此,可以很方便地想象,声明一个内部函数就像构造一个对象,其成员只是该函数周围封闭范围内的变量。

如果您不经常这样做,这可能不是那么糟糕,因为内存量与在堆上分配对象大致相同;(并且在某些情况下,您可以进行一些巧妙的优化来避免这种情况,例如,如果您只将函数向下传递到调用堆栈,您可以在本地堆栈空间中分配,或者进行一些内联​​等)。但是,在大多数情况下它仍然是一个分配,因此您应该避免在繁忙循环中使用太多它们或创建许多内部函数。

因此,要回答您的问题,一般来说选项 B 会更快。但是不要让这让你气馁!

我最后的看法是,方便的内部函数完全超过了小的运行时间开销,我会说在任何方便的地方使用它们。如果结果证明是性能瓶颈,请返回并优化它们。