据我所知,最好将值缓存在我们需要重复的对象中。例如,做
var currentObj = myobject.myinnerobj.innermostobj[i]
并使用'currentObj'进行进一步的操作比性能更好
myobject.myinnerobj.innermostobj[i]
无处不在,就像在循环中说的那样..我被告知它每次都会在对象内部查找保存脚本..
我有大约1000行代码,我为改善性能而做的唯一改变是(在许多地方)并且执行它所花费的总时间从190ms增加到230ms。在Firefox 4上使用firebug 1.7检查了这两次。
我学到的是真的(意思是我过度使用它还是误解了它)?或者还有其他方面,我不知道..?
答案 0 :(得分:1)
创建变量需要初始成本,因此在看到任何性能提升之前,您必须使用该变量几次(取决于查找的复杂性以及许多其他内容)。
此外,Javascript的执行方式在短短几年内发生了很大变化。如今大多数浏览器都以某种形式编译代码,这会改变性能和性能。现在,缓存引用的吞吐量增益可能比写出建议的时间要少。
答案 1 :(得分:0)
您提供的示例似乎只是Javascript,而不是jQuery。由于您对现有Javascript对象使用直接对象属性引用和数组索引,因此不涉及查找。因此,在您的情况下,添加var currentObj...
可能会使实例化currentObj
所需的少量增加开销。虽然这可能非常小,并且在代码的方便性和可读性方面并不罕见,但在长循环中,您可能会在计时时看到差异。
您可能正在考虑的缓存与jQuery对象有关,例如
var currentObj = $('some_selector');
运行jQuery选择器涉及大量处理,因为它必须查看整个DOM(或其某个子集)来解析选择器。所以这样做,与每次引用某些东西时运行选择器相比,确实可以节省大量开销。但这不是你在你的例子中所做的。
看到这个小提琴:
在firefox和chrome中(没有测试IE) - 在任何情况下,时间都是相同的。
答案 2 :(得分:0)
我所学到的是真的(也就是说 我过度使用或误解 它)?或者还有其他方面 它我不知道..?
如果是这种情况并不明显,因为您没有发布指向您代码的链接。
我认为你的大部分困惑都来自JavaScript开发人员主要关注缓存DOM对象的事实。 DOM对象查找比查找myobj.something.something2
之类的内容要昂贵得多。我猜你大多数关于缓存重要性的内容都是这样的例子(因为你提到了jQuery):
var myButton = $('#my_button');
在这种情况下,缓存DOM引用可以在具有复杂DOM的页面上获得快速收益。在您的示例中,它可能只是通过让您必须记住currentObj
只是另一个对象的别名来降低代码的可读性。在循环中,这是有意义的,但在其他地方,不值得记住另一个变量。