【问题标题】:Efficiency of frequently called function initializing an array in JSJS中频繁调用函数初始化数组的效率
【发布时间】:2019-10-18 15:58:53
【问题描述】:

我有一些代码可以解析数百个对象(来自网络请求)。然后这段代码将调用一个函数来查看它是否匹配一个值。

I.E.

(1..100+){
    isMatch(foo);
}

function isMatch(foo) {
    const matches = ["apple", "orange", "strawberry"];
    return matches.includes(foo);
}

我的问题是 JS 如何处理正在创建的“匹配”数组。 isMatch 函数可能会被调用 100 多次。它是每次都在内存中不断地实例化这个数组,还是会自动缓存它?或者,这真的不是因为数组大小和GC的内存问题吗?

另外,使用 array.includes 与使用正则表达式进行实际匹配之间有什么性能差异吗?

【问题讨论】:

  • 嗯,我没有任何确凿的证据,但感觉matches 数组不会被缓存。再说一次,它可能,我不确定。似乎编译器可以推断出它需要保留该数组的一个副本,而不是多个副本,尤其是在您多次调用该函数之后。
  • “另外,...之间的任何性能差异” -> jsperf.com
  • const 的作用域是函数,因此会一遍又一遍地创建和销毁。如果您有一个固定列表,请在更广泛的范围内声明它并直接在 isMatch 中引用它,或者将其作为参数传递,如 isMatch(foo, LIST_OF_MATCHES)

标签: javascript caching memory garbage-collection


【解决方案1】:

constscoped to the function,因此会一遍又一遍地创建和销毁。如果您有一个固定列表,请在更广泛的范围内声明它,或者直接在 isMatch 中引用它,或者将其作为参数传递,例如 isMatch(foo, LIST_OF_MATCHES)

【讨论】:

  • 你确定这不会被 JIT 优化吗?我不认识自己,但它似乎可能是。如果它是一个一直创建的数组,并且它始终相同,从不变异,那么它似乎可以优化为只创建一次而不是 GC'd。
  • @VLAZ 是的,我希望 JS 会自动处理这个问题
  • 可能是这样,但这不是关于特定供应商的 JIT 编译的 JS 引擎的问题。就 JavaScript 而言,const 是有范围的,并且会不断地重建。如果有人制作了一个更高效的编译器,那很酷,但在技术上不是这个问题的一部分。
猜你喜欢
  • 2015-07-20
  • 2023-03-09
  • 2021-12-15
  • 2016-01-19
  • 2016-04-14
  • 1970-01-01
  • 2012-09-15
  • 2021-09-24
  • 1970-01-01
相关资源
最近更新 更多