2012-09-14 55 views
0

我想優化一些基本的jQuery腳本遍歷和隱藏/顯示一些無序列表。Javascript性能:緩存vs無緩存 - 奇怪的結果

下面是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"); 

有人能解釋我在做什麼錯?爲什麼緩存的版本似乎是慢?

+0

我會冒險猜測你從緩存版本中獲得的好處不會超過緩存數據的開銷,因此爲了緩存目的而收集和存儲所有數據需要更多的總時間。檢索並返回非緩存版本所需的特定數據。 – taz

回答

5

簡短回答:選擇器其實很快,但是find就像地獄一樣慢。您的緩存版本引入了多個find調用 - 這是很慢的。

稍微長一點的答案:如果您繼續按原樣重新使用,您只能真正從緩存jQuery集合中受益。看看其中的緩存版本顯然跑得快這個測試用例:http://jsperf.com/cachingjq

+1

這個。在我看來,如果你正在使用'find',很可能你需要重新評估你的選擇器 – BLSully

+0

即使問題得到了回答,如果find是改進原始代碼,那麼這將是一個很好的簡單替代方案出了問題? –

+0

@GeorgeKatsanos:請參閱我的回答,以示例代碼 – BLSully

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"); 
+0

謝謝,聰明地使用逗號分隔的選擇器來定義上下文。沒有想到。 –

+0

確實似乎更快。 2-3% –

1

這是關於find()是「緩慢地獄」,還是事實上快得像地獄一樣值得商榷。您的性能問題可能取決於您使用的jQuery版本或DOM的結構。

在這裏看到的說法另一邊find()性能: jQuery selector performancehttp://seesparkbox.com/foundry/jquery_selector_performance_testing

Benchmark測試:Find() Vs Selector

+0

這篇文章很有啓發。我想知道jQuery版本是否對此產生影響。(無論您使用的是舊版本還是最新版本..) –

1

緩存你實際上將要工作的內容,你的情況「李'元素。

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

由於額外和冗餘的li元素搜索,您的「優化」緩存版本實際上沒有進行優化。

+0

添加一些上下文並幫助查詢? –

+0

@GeorgeKatsanos我想爲上下文你可以改變我的例子中的變量menuItems。在幫助查詢方面,緩存父項強制您在每個後續語句中重複使用li選擇器,這不是對「未優化」示例的優化。當我期望優化選擇器$('?')時,我會盡量減少選擇器的$('?')長度,從最高級別開始並繼續工作。 – Rob

+0

謝謝,現在已經越來越清晰了.. –