Javascript性能:缓存与无缓存 - 奇怪的结果

时间:2012-09-14 14:03:20

标签: jquery dom performance

我正在尝试优化一些遍历和隐藏/显示一些无序列表的基本jquery脚本。

这是jsperf中的测试用例:http://jsperf.com/caching-vs-no-caching

我在两个浏览器中运行测试:Chrome和IE7 / IE8,令人惊讶的是缓存的情况比较慢 - 稍微但仍然如此。

未经优化的版本是:

(function( $ ) {
  $.fn.menuManipulation = function() {
    this.parents().show();
  };
})( jQuery );

$('.menu-vertical li.selected').menuManipulation();
$(".menu-vertical li.selected > ul.static").show();
$('li.static').has('ul').addClass("with-child");

和缓存的那个:

(function($) {  
    $.fn.menuManipulation = function() {
    this.parents().show();
    };
})(jQuery);

var menu = $('.menu-vertical');
menu.find('li.selected').menuManipulation();
menu.find('li.selected > ul.static').show();
menu.find('li.static').has('ul').addClass("with-child");

有人可以解释我做错了什么,为什么缓存版本似乎更慢?

4 个答案:

答案 0 :(得分:5)

简短回答:选择器实际上非常快,但find速度很慢。您的缓存版本引入了多个find调用 - 这很慢。

稍微长一点的回答:如果你继续按原样重新使用它,你只能从缓存jQuery集合中获益。看看这个缓存版本运行得更快的测试用例:http://jsperf.com/cachingjq

答案 1 :(得分:2)

乔治,

在您的“缓存”中尝试此操作案例,看看性能差异是什么:

(function($) {  
    $.fn.menuManipulation = function() {
        this.parents().show();
    };
})(jQuery);

var menu = $('.menu-vertical');
$('li.selected', menu).menuManipulation();
$('li.selected > ul.static', menu).show();
$('li.static', menu).has('ul').addClass("with-child");

答案 2 :(得分:1)

关于find()是否“像地狱一样慢”,或者说实际上是快得如何,这是值得商榷的。您的性能问题可能取决于您使用的jQuery版本或DOM的结构。

请参阅此处了解find()效果参数的另一面: jQuery selector performancehttp://seesparkbox.com/foundry/jquery_selector_performance_testing

基准测试:Find() Vs Selector

答案 3 :(得分:1)

缓存您实际要处理的元素,例如“li”元素。

var menu = $('.menu-vertical li');
menu.filter('.selected').children('ul.static').show().end().menuManipulation();
menu.filter('.static').has('ul').addClass("with-child");

由于对li元素的额外和冗余搜索,您的“优化”缓存版本实际上不太优化。