【问题标题】:Am I improving performance I declare a variable outside of busy function in JavaScript?我在 JavaScript 中的繁忙函数之外声明了一个变量,是否提高了性能?
【发布时间】:2021-03-10 01:47:48
【问题描述】:

想象一下,我有一个经常被调用的函数,需要在内部使用一个变量。

function busyFunction() {
    var intermediateResult;
    /* compute something */
    return something;
}

据我了解,在第一个示例中,浏览器将为变量分配内存,然后安排它在某个时间进行垃圾回收。

var intermediateResult;
function busyFunction() {
    /* compute something */
    return something;
}

我知道第二个示例会污染busyFunction 之外的范围。但是由于变量的内存在父函数之前不会被垃圾收集,这对性能有好处吗?如果我在这里错了或者效果可以忽略不计,我宁愿使用第一个更干净的例子。

【问题讨论】:

  • 让 GC 完成它的工作,而不是污染全局范围。如果这个函数被不同的异步调用,你不会得到意想不到的结果
  • @Cid 异步调用的好处。

标签: javascript performance function scope garbage-collection


【解决方案1】:

简而言之,是的。您消耗的资源更少,因为每次执行函数时,您都不会在其范围内创建一个变量,然后在函数执行结束后将其丢弃。就我个人而言,我建议创建一个同时包含变量和函数的对象,这样变量就不会只是“浮动”,而是细节。

然而,另一件事是代码的可读性。我认为问题中的示例是您正在处理的内容的简化版本。在这里,它基本上归结为可读性和效率之间的平衡。如果您认为将其放在外面会令人困惑,那么请将其留在函数中,除非将其放在外面的好处远远超过代码不易混淆的事实。

除非性能改进非常显着,否则为了清晰起见,我建议将其留在函数中。

【讨论】:

    【解决方案2】:

    在更高的范围内声明变量会使它们的访问速度变慢(在全局范围内非常如此),并且更重要的是 - 更难为编译器进行优化。垃圾收集成本可以忽略不计。我预计这实际上会更慢。差异应该非常小(几乎无法测量),但一如既往,您可以自己在实际代码中使用真实数据对其进行基准测试。

    性能会提高的唯一情况是,如果您想在调用之间保持一个值,并且通过不重复运行昂贵的初始化代码来获得优势。特别是如果您可以在调用函数之前将变量设置为 constant 初始化。

    一般来说,aim for readable and idiomatic code,优化编译器也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2021-08-09
      相关资源
      最近更新 更多