我们的代码库中有很多对象,名称间隔以避免冲突。
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在幕后自动为我们做一些优化。
答案 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%。