javascript - 在 javascript 中嵌套函数和性能?

标签 javascript performance nested-function

有些同事说嵌套函数不利于性能,我想问一下。

假设我有这个功能:

function calculateStuff() {
    function helper() {
    // helper does things
    }
    // calculateStuff does things
    helper();
}

helper 是一个私有(private)函数,仅在 calculateStuff 内部使用。这就是为什么我想将其封装在 calculateStuff 中。

这是否比做更糟糕的性能:

function helper() {

}

function calculateStuff() {
    helper();
}

请注意,在第二种情况下,我将 helper 暴露给了我的范围。

最佳答案

理论上,这会对性能产生潜在影响,因为每次调用 calculateStuff 时,您都需要为 helper 创建一个新的闭包上下文(因为它可能引用来自封闭范围)。

非常确定大多数 JavaScript 引擎中的 JIT 编译器应该能够告诉您您实际上并没有从父上下文访问任何变量,并且只是跳过绑定(bind)所有这些值.我可能遗漏了一些边缘情况,在这些情况下这通常是不可能的,但它似乎足够直截了当。

无论如何,我们讨论的是每次迭代的纳秒级开销,因此除非您的代码执行很多,否则您永远不会注意到时差。如果有疑问,分析它并检查...


我决定听从自己的建议,并对这个 on jsperf 进行分析,在 Safari 9 中。我使用了原始问题中提供的不执行任何操作的函数,以强调仅调用嵌套函数的开销:

嵌套函数:每秒 136,000,000 次调用

平面函数:每秒 1,035,000,000 卡

Oriol's IIFE version : 每秒 220,000,000 卡

很明显,平面函数比任何一个替代版本都快很多但是,想想这些数字的大小——即使是“慢”版本也只增加了 0.007 微秒的执行时间。如果您在该函数中进行任何类型的计算或 DOM 操作,它绝对会使嵌套函数的开销相形见绌。

关于javascript - 在 javascript 中嵌套函数和性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33248316/

相关文章:

javascript - ~ 到底是做什么的?

如果页面位于 bfcache 中,则 JavaScript 重新加载页面

javascript - canvas.toDataURL 导致纯黑色图像?

java - Java 中循环的性能

python - Python中的嵌套函数

c - 嵌套函数被禁用,使用 -fnested-functions 重新启用

python - 嵌套函数中的局部变量

javascript - JS/JQUERY 不更新字符串数组值

performance - 快速生成 "triangle sequence": avoiding mispredictions

.net - 软件带宽/数据库增长公式