为什么在对象中缓存值需要更多时间?

时间:2011-04-27 12:37:32

标签: javascript jquery

据我所知,最好将值缓存在我们需要重复的对象中。例如,做

var currentObj = myobject.myinnerobj.innermostobj[i]

并使用'currentObj'进行进一步的操作比性能更好

myobject.myinnerobj.innermostobj[i]

无处不在,就像在循环中说的那样..我被告知它每次都会在对象内部查找保存脚本..

我有大约1000行代码,我为改善性能而做的唯一改变是(在许多地方)并且执行它所花费的总时间从190ms增加到230ms。在Firefox 4上使用firebug 1.7检查了这两次。

我学到的是真的(意思是我过度使用它还是误解了它)?或者还有其他方面,我不知道..?

3 个答案:

答案 0 :(得分:1)

创建变量需要初始成本,因此在看到任何性能提升之前,您必须使用该变量几次(取决于查找的复杂性以及许多其他内容)。

此外,Javascript的执行方式在短短几年内发生了很大变化。如今大多数浏览器都以某种形式编译代码,这会改变性能和性能。现在,缓存引用的吞吐量增益可能比写出建议的时间要少。

答案 1 :(得分:0)

您提供的示例似乎只是Javascript,而不是jQuery。由于您对现有Javascript对象使用直接对象属性引用和数组索引,因此不涉及查找。因此,在您的情况下,添加var currentObj...可能会使实例化currentObj所需的少量增加开销。虽然这可能非常小,并且在代码的方便性和可读性方面并不罕见,但在长循环中,您可能会在计时时看到差异。

您可能正在考虑的缓存与jQuery对象有关,例如

var currentObj = $('some_selector');

运行jQuery选择器涉及大量处理,因为它必须查看整个DOM(或其某个子集)来解析选择器。所以这样做,与每次引用某些东西时运行选择器相比,确实可以节省大量开销。但这不是你在你的例子中所做的。

看到这个小提琴:

http://jsfiddle.net/SGqGu/7/

在firefox和chrome中(没有测试IE) - 在任何情况下,时间都是相同的。

答案 2 :(得分:0)

  

我所学到的是真的(也就是说   我过度使用或误解   它)?或者还有其他方面   它我不知道..?

如果是这种情况并不明显,因为您没有发布指向您代码的链接。

我认为你的大部分困惑都来自JavaScript开发人员主要关注缓存DOM对象的事实。 DOM对象查找比查找myobj.something.something2之类的内容要昂贵得多。我猜你大多数关于缓存重要性的内容都是这样的例子(因为你提到了jQuery):

var myButton = $('#my_button');

在这种情况下,缓存DOM引用可以在具有复杂DOM的页面上获得快速收益。在您的示例中,它可能只是通过让您必须记住currentObj只是另一个对象的别名来降低代码的可读性。在循环中,这是有意义的,但在其他地方,不值得记住另一个变量。