回答
你的問題的答案是:是的。
不要擔心性能差異,除非你的代碼很慢。如果是,則使用分析器確定瓶頸。
從分析的觀點來看:
$(".div1 h2, div1 h3")
應更快jQuery將管它通過querySelectorAll
(如果它存在)和本機代碼將運行比非本地代碼更快。它還可以保存一個附加的函數調用。
$(".div1").find("h2, h3")
是,如果你打算更好地對.div1
鏈接其他一些功能:
$(".div1").find("h2, h3").addClass('foo').end().show();
對我來說「慢」意味着對於大多數JS功能來說,超過大約0.3s。沒有辦法讓瀏覽器掛起1秒鐘,更不用說10.如果它通過了我的「慢門檻」,我會重構代碼並分析性能。 – zzzzBov 2011-06-03 17:21:46
是的,你是對的,在這種情況下,性能差異並不是什麼大不了的事情。但要小心這句話。我有點受到傷害,看到幾個性能問題和人們在思考「如果它的工作,我不在乎」... – BrunoLM 2011-06-03 17:25:38
我的意思是,你不應該擔心性能,除非它是一個問題。我從來沒有說過懶惰的代碼是好的,但我不介意O(n^3)循環集,如果他們是可以理解的並且不會導致性能問題。如果他們這樣做了,我一定會努力將它們儘可能地減少到O(n)。 – zzzzBov 2011-06-03 17:28:23
其實,.find()CAN更快。
當試圖選擇多個元素時,選擇器似乎會更快找到;然而,如果你使用$ .find,甚至緩存後代,你可以看到它更快: http://jsperf.com/selector-vs-find-again/11
我也乞求不同性能不重要。在這個智能手機的世界裏,電池壽命是重中之重。
我剛剛找到這個答案,並希望在這裏添加一些數字,可能會有人發現他們有幫助和好奇。在我的情況下,我尋找最快的jQuery
選擇器爲獨特的元素。我不喜歡沒有理由地添加ID,所以我想方設法選擇沒有ID的元素。
在我的小型研究中,我使用了非常棒的selector profiler for jQuery。這裏是我從Chrome的控制檯解僱了,直接後,我加入Profiler的庫代碼代碼:
$.profile.start()
// Lets
for (i = 0; i < 10000; i++) {
// ID with class vs. ID with find(class)
$("#main-menu .top-bar");
$("#main-menu").find(".top-bar");
// Class only vs element with class
$(".top-bar");
$("nav.top-bar");
// Class only vs class-in-class
$(".sticky");
$(".contain-to-grid.sticky");
}
$.profile.done()
這裏有結果:
jQuery profiling started...
Selector Count Total Avg+/-stddev
#main-menu .top-bar 10000 183ms 0.01ms+/-0.13
nav.top-bar 10000 182ms 0.01ms+/-0.13
.contain-to-grid.sti... 10000 178ms 0.01ms+/-0.13
.top-bar 10000 116ms 0.01ms+/-0.10
.sticky 10000 115ms 0.01ms+/-0.10
#main-menu 10000 107ms 0.01ms+/-0.10
undefined
最慢選擇是這個榜的首位。最快的是在底部。令我驚訝的是,在選擇ID之後,即$('#main-menu')
,我發現了單個類選擇器,例如.top-bar
和.sticky
。乾杯!
- 1. 多個web表單VS jQuery選擇
- 2. jQuery的:«孩子»VS«.find»+«.live»
- 3. D3全選VS jQuery選擇
- 4. jQuery使用選擇器後.find()
- 5. JQuery類選擇器vs id選擇器
- 6. angular.element選擇器vs jquery選擇器
- 7. jQuery選擇器:多重選擇vs select
- 8. jQuery選擇vs純javascript
- 9. jQuery - 單擊鏈接以選擇一個選擇菜單選項
- 10. css選擇器vs jQuery遍歷
- 11. CSS多個子選擇器vs單標籤選擇器性能
- 12. 哪個jQuery選擇器更有效率.find()
- 13. JQuery的IE11單選按鈕選擇
- 14. UnderscoreJS - _.some()VS _.find()
- 15. Application.Match vs Find
- 16. jQuery菜單項選擇
- 17. 道場日期選擇器jQuery的Vs的日期選擇器
- 18. 使用jQuery選擇多個單選按鈕組的第一個單選按鈕
- 19. 使用.find()或選擇複選框時Bizzare Jquery(Mobile)錯誤?
- 20. jQuery find()選擇選項在IE9中不起作用
- 21. 單個jquery選擇需要多個$(
- 22. jquery選擇器vs css3選擇器的性能
- 23. jQuery選擇器錯誤?由選擇與簡單的選擇和發現()
- 24. 如何選擇一個選擇框第一個選項的jQuery
- 25. 簡單的jQuery選擇器
- 26. jQuery的 - 選擇菜單項
- 27. 有一個選擇菜單在另一個選擇菜單中選擇一個值與JQuery的移動
- 28. 簡單的VBA從第一個.Find值中選擇一個範圍?
- 29. jQuery排除來自#find結果的選擇器匹配
- 30. jQuery的選擇與班。不,.closest和.find一起
要找出你可以剖析你的代碼:http://jsperf.com/ – 2011-06-03 17:03:38
看到[這個答案](http://stackoverflow.com/a/12177876/323407)爲一個非性能相關但重要的區別。就個人而言,我不會擔心微秒的差異,除非代碼將循環運行,或者您正在編寫一個將由第三方使用的庫。 – Tgr 2012-08-30 21:52:02
問題往往是一樣的,10⁶x 1microsec使1秒:) – 2014-04-04 08:13:36