JavaScript对象引用缓存

时间:2015-05-28 19:44:51

标签: javascript

我们的代码库中有很多对象,名称间隔以避免冲突。

Example : App.local.view.MyView...

在我在代码库中看到的大多数地方,我们使用完整路径来获取对象的引用,并在同一函数中重复多次。

   Example : 
   function hello() {
       App.local.view.MyView.render();
       ...
       ... 
       App.local.view.MyView.reset();
   }

我想了解是否存储对象的引用,如下所示

var MyView = App.local.view.MyView;

会有任何性能提升。是什么让我问这个问题是形式我的理解现代浏览器如chrome在幕后自动为我们做一些优化。

2 个答案:

答案 0 :(得分:5)

这将是一项改进,但我们正在谈论一个完全可以忽视的

查找对象的属性需要时间,但它确实非常快。

如果出于性能原因这样做,不要

如果你这样做是为了让你的代码更具可读性/可维护性,那就没关系。

修改

我创建了一个基准来测试这个: Run the benchmark

var data = {a: {b: {c: {d: 1}}}};
var cache = data.a.b.c.d;

// uncached 901,326,988 ±1.03% fastest
// cached 879,568,962 ±0.95% 2% slower

// Chrome 41 on OSX 10.10

这太令人惊讶了!

原来打电话

更快
data.a.b.c.d + 1

而不是

cache + 1

我确信这会因JavaScript的实现而有所不同。提供为什么发生这种情况的具体原因将留给在js引擎内部挖掘的其他genii。

  

因此,考虑到这一点,我上面的建议保持不变:

如果出于性能原因这样做, - 实际上速度较慢。

如果你这样做是为了让你的代码更具可读性/可维护性,那就没关系 - 性能成本值得更清晰的代码。

答案 1 :(得分:0)

这是特定于实现的,并且在很大程度上取决于底层的JavaScript引擎。

例如,v8引擎(Chrome和其他人)使用so-called hidden classes来表示JavaScript对象。这样做的好处是,已知每个对象的属性都在内存中的固定偏移处,因此访问对象的属性非常快。

另一方面,一些实现(我只使用node.js所以我没有任何使用此方法的特定浏览器引用,但Firefox似乎使用此方法 - 见下文)可能使用字典来映射对象& #39;属性到他们的记忆位置。字典查找需要更多操作(更多CPU周期),因此它们有点慢。

然而,总的来说,我们谈论的是极小的差异。

  

总结一下,在性能方面,这对您的代码性能几乎没有影响。但是,代码风格方面,它可以提高代码的可读性和可维护性。

这个jsperf(由@naomik提供)似乎支持这一点 - 当在Chrome中运行时,差异大约为5%,而对于Firefox则高达29%。