2011-06-03 16 views
48

जो एक प्रदर्शन परिप्रेक्ष्य के रूप में उपयोग करने के लिए बेहतर है:jQuery एकल चयनकर्ता बनाम .find()

$(".div1 h2, .div1 h3") 

या

$(".div1").find("h2, h3") 
+6

यह पता लगाने के लिए कि आप अपना कोड प्रोफाइल कर सकते हैं: http://jsperf.com/ –

+2

गैर-प्रदर्शन से संबंधित के लिए [यह उत्तर] (http://stackoverflow.com/a/12177876/323407) देखें लेकिन महत्वपूर्ण अंतर व्यक्तिगत रूप से मैं microsecond मतभेदों के बारे में चिंता नहीं करता जब तक कि कोड लूप में नहीं चलेगा या आप एक पुस्तकालय लिख रहे हैं जिसका उपयोग तीसरे पक्ष द्वारा किया जाएगा। – Tgr

+0

समस्या अक्सर वही होती है, 10⁶ x 1microsec 1sec बनाता है :) –

उत्तर

31

आपके प्रश्न का उत्तर है: हाँ।

प्रदर्शन अंतर के बारे में चिंता न करें, जब तक आपका कोड धीमा न हो। यदि ऐसा है, बाधाओं को निर्धारित करने के लिए एक प्रोफाइलर का उपयोग करें।

एक विश्लेषण दृष्टिकोण से

:

$(".div1 h2, div1 h3") 

तेजी से jQuery के रूप में होना चाहिए होगा यह querySelectorAll के माध्यम से पाइप (यह मौजूद है) और मूल कोड तेजी से गैर देशी कोड से चलेंगे। यह अतिरिक्त फ़ंक्शन कॉल पर भी सहेजा जाएगा। असल में

$(".div1").find("h2, h3").addClass('foo').end().show(); 
+1

"धीमा" का मतलब लगभग 0.3 'से अधिक है। ऐसा कोई रास्ता नहीं है कि मैं ब्राउज़र को 1s के लिए लटका दूंगा, बहुत कम 10. यदि यह मेरी "धीमी दहलीज" पास करता है तो मैं कोड को दोबारा प्रतिक्रिया दूंगा और प्रदर्शन का विश्लेषण करूंगा। – zzzzBov

+0

हां, आप सही हैं, इस मामले में प्रदर्शन अंतर एक बड़ा सौदा नहीं है। लेकिन उस वाक्य से सावधान रहें। मैं कई प्रदर्शन मुद्दों और लोगों को सोचने के लिए थोड़ी परेशान हूं कि "अगर यह काम करता है तो मुझे कोई परवाह नहीं है" ... – BrunoLM

+1

मेरा बयान से मेरा क्या मतलब था कि आपको तब तक प्रदर्शन के बारे में चिंता नहीं करनी चाहिए जब तक कि यह कोई समस्या न हो। मैंने कभी नहीं कहा कि मैला कोड ठीक था, लेकिन मुझे ओ (एन^3) लूप का सेट नहीं लगता है अगर वे समझ में आ रहे हैं और प्रदर्शन के मुद्दों का कारण नहीं हैं। यदि उन्होंने किया, तो मैं निश्चित रूप से उन्हें संभवतः ओ (एन) के करीब के रूप में कम करने के लिए काम करता हूं। – zzzzBov

41

http://jsperf.com/selector-vs-find-again

चयनकर्ता तेजी

(नोट है : यादृच्छिक एचटीएमएल बनाया बस इतना ही यह पृष्ठ पर उन तत्वों नहीं था)

+0

वाह, आप तेज़ हैं;)। – Thai

+14

यह वास्तविक उत्तर है; इसके बजाय "इससे कोई फर्क नहीं पड़ता"। यह मायने रखता है क्योंकि ओपी ने पूछा। – Akash

+0

क्या आपके पास कोई तत्व है जो इसे तेज़ी से बनाता है? मैं सहजता से सोचा था कि खोज तेजी से होना चाहिए। तो मैं उत्सुक हूं कि इसे धीमा कर देता है। – Ar3s

14

, .find() तेजी से किया जा सकता:

$(".div1").find("h2, h3") 

बेहतर .div1 पर कुछ अन्य कार्य चेनिंग पर अगर आप की योजना बना रहे है।

एकाधिक तत्वों को चुनने का प्रयास करते समय चयनकर्ता अधिक तेज़ी से प्रतीत होते हैं; हालांकि, अगर आप एक $ .find का उपयोग करें, या यहाँ तक कि वंशज कैश, आप देख सकते हैं यह बहुत तेजी से है: http://jsperf.com/selector-vs-find-again/11

मैं भी के बारे में प्रदर्शन महत्वपूर्ण नहीं किया जा रहा अलग करने के लिए भीख माँगती हूँ। स्मार्ट फोन की इस दुनिया में, बैटरी जीवन राजा है।

+0

यह दिलचस्प है, लेकिन इस मामले में यह 'h2' और' h3' की खोज नहीं करेगा जो केवल 'div1' के वंशज हैं। – Dan

+0

@Dan "खोज कैश" वास्तव में div1 का उपयोग करता है, लेकिन बस इसे ऊपर कैश करता है: 'var cache = $ (" div1 ");' कहा जा रहा है कि फ़ायरफ़ॉक्स ऐसा लगता है कि कोई तेज़ नहीं है। उस स्थिति में, आप सही हैं, "स्पीड फाइंड" सभी 'h2'' h3' पाएंगे, लेकिन उन्हें कक्षाओं को सीधे देना आसान है: '$ .find ("। Classh2, .classh3")' लक्षित करने के लिए विशिष्ट वाले – Drath

1

मुझे अभी यह जवाब मिला है और यहां कुछ संख्याएं जोड़ना चाहते हैं, तो कोई उन्हें सहायक और उत्सुकता से ढूंढ सकता है। मेरे मामले में मैंने अद्वितीय तत्व के लिए सबसे तेज़ jQuery चयनकर्ता की तलाश की। मैं बिना कारण के आईडी जोड़ना पसंद नहीं करता, इसलिए मैंने आईडी के बिना तत्वों का चयन करने का तरीका देखा।

मेरे छोटे शोध में मैंने jQuery के लिए अद्भुत selector 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 

सबसे धीमा चयनकर्ताओं इस चार्ट के शीर्ष पर हैं और यहाँ कोड मैं क्रोम कंसोल से सीधे निकाल दिया बाद मैं प्रोफाइलर के पुस्तकालय कोड जोड़ा है। सबसे तेज़ लोग नीचे हैं। आईडी के चयनकर्ता के बाद आश्चर्यजनक रूप से मेरे लिए $('#main-menu') मुझे सिंगल क्लास चयनकर्ता मिला है उदा। .top-bar और .sticky। चीयर्स!

संबंधित मुद्दे