2009-01-06 7 views
9

में तत्वों को खोजने के लिए अगर मैं एक CSS वर्ग जो मैं केवल कभी तत्वों के रूप में लागू , है जैसे:लिए सबसे कारगर तरीका jQuery

<form class="myForm"> 

इन दो jQuery चयनकर्ताओं में से कौन सबसे कुशल, और क्यों है?

a) $('form.myForm') 

b) $('.myForm') 

उत्तर

9

जैसा कि पहले से ही रेडस्क्वेयर का उल्लेख किया गया है, चयन एल्गोरिदम बाद के jQuery संस्करणों में बदल गया है (आंशिक रूप से getElementsByClassName समर्थन के कारण)। इसके अतिरिक्त, मैंने आज के सबसे हालिया jQuery संस्करण (v1.6) के साथ इसका परीक्षण किया और तुलना के लिए document.getElementsByClassName के लिए एक परीक्षण भी जोड़ा (कम से कम फ़ायरफ़ॉक्स 4 और क्रोम में काम करता है)।

फ़ायरफ़ॉक्स 4 में परिणाम थे:

// With 100 non-form elements: 
$('.myForm') : 366ms 
$('form.myForm') : 766ms 
document.getElementsByClassName('myForm') : 11ms 

// Without any other elements: 
$('.myForm') : 365ms 
$('form.myForm') : 583ms 
document.getElementsByClassName('myForm') : 11ms 

स्वीकार किए जाते हैं जवाब पुरानी है (और अभी भी तरह "jQuery में तत्वों को खोजने के लिए कारगर तरीका" कुछ के लिए खोज के द्वारा पाया जाता है) और लोगों को गुमराह कर सकते, तो मैं महसूस किया कि मुझे यह लिखना है।

इसके अलावा, jQuery और मूल ब्राउज़र चयनकर्ता कार्यों के बीच का समय अंतर देखें। jQuery 1.2.6 में $('.myForm') जबकि jQuery 1.6 में यह था केवल के बारे में गुना धीमी getElementsByClassName की तुलना में अधिक से बार धीमी थी, लेकिन फिर भी $('form.myForm') की तुलना में तेजी (पुराना जवाब के विपरीत)।

नोट: परिणाम Firefox 4 (क्रोम के साथ इसी तरह के परिणाम) के साथ प्राप्त किया गया। ओपेरा 10 में टैग नाम के साथ पूछताछ केवल थोड़ी तेज है, लेकिन ओपेरा भी तेज़ देशी getElementsByClassName का समर्थन करता है।

टेस्ट कोड:http://jsbin.com/ijeku5

22

संपादित: नीचे दिए गए परिणामों शायद Firefox 3.5 में, jQuery 1.2.6 के लिए कर रहे हैं। ब्राउज़र और jQuery में स्पीड सुधार ने इस जानकारी को अप्रचलित रूप से प्रस्तुत किया है। 4 रूपों और लगभग 100 अन्य तत्वों के साथ

  • एक पृष्ठ पर::


मैं सिर्फ एक त्वरित बेंच मार्किंग परीक्षण लिखा

  • का उपयोग $('form.myForm') 10000 बार ले लिया 1.367s
  • $('.myForm') का उपयोग करके 10000 बार 4.202s (307%)
  • केवल 4 रूपों और कोई अन्य तत्वों के साथ एक पृष्ठ पर:
    • का उपयोग $('form.myForm') 10000 बार 1.352s
    • का उपयोग $('.myForm') 10000 बार 1.443s ले लिया लिया (106%)
  • ऐसा प्रतीत होता है कि किसी विशेष नाम के तत्वों की खोज करना एक कण के लिए सभी तत्वों की खोज करने से कहीं अधिक तेज़ है आर कक्षा

    संपादित करें: यहाँ मेरी परीक्षण कार्यक्रम है: http://jsbin.com/ogece

    कार्यक्रम 100 <p> टैग और 4 <form> रों साथ शुरू होता है, दो अलग अलग परीक्षण चलाता है, <p> टैग हटा देता है और परीक्षण फिर से चलाता है। आश्चर्यजनक रूप से, इस तकनीक का उपयोग करते समय, form.myForm धीमा है। अपने लिए कोड पर नज़र डालें और इसे बनाएं जो आप करेंगे।

    +0

    शायद pastebin.me पर या jsbin.com nickf परीक्षण मामलों प्रदान करते हैं? – redsquare

    +2

    संभवतः ब्राउज़र पर भी निर्भर है और कौन सी सीएसएस चयनकर्ता मूल रूप से समर्थित हैं। –

    7

    पहला चयनकर्ता तेज़ होना चाहिए क्योंकि jQuery फ़िल्टर किए जाने वाले तत्वों की संख्या को कम करने के लिए अंतर्निहित फ़ंक्शन "getElementsByTagName" का उपयोग कर सकता है। दूसरे को डीओएम में सभी तत्व मिलना होगा और अपनी कक्षा की जांच करनी होगी।

    1

    form.myForm आईएमओ बहुत तेज़ है क्योंकि इसे केवल तत्वों के एक सबसेट/फ़िल्टर किए गए सेट को देखने की आवश्यकता है और पूरे दस्तावेज़ को फिर से शुरू करने की आवश्यकता नहीं होगी।

    4

    slickspeed आज़माएं जहां आप jquery सहित जेएस libs के एकाधिक में चयनकर्ताओं की मोटा गति देख सकते हैं।

    +0

    शांत साइट! jQuery जीतता है! हालांकि, यह परीक्षण नहीं करता है .className बनाम tagName.className :( – nickf

    1

    संदर्भ के साथ उपयोग किए जाने पर पहला उदाहरण बहुत तेज़ हो जाता है। दूसरा उदाहरण तेजी से चला जाता है, लेकिन ज्यादा नहीं।

    http://jsbin.com/uluwe

    0

    enobrev, दिलचस्प: मैं एक संदर्भ के साथ तुलना करने के लिए अपने उदाहरण का विस्तार किया। मैं सिर्फ अपने उदाहरण लेकिन का उपयोग कर jQuery 1.3 बीटा 2 here

    परिणाम .... (कोष्ठक में 1.2.6 गति)

    // With 100 non-form elements and Context: 
    $('.myForm', '#someContainer') : 4063ms (3707ms) 
    $('form.myForm', '#someContainer') : 6045ms (4644ms) 
    
    // With 100 non-form elements: 
    $('.myForm') : 3954ms (25086ms) 
    $('form.myForm') : 8802ms (4057ms) 
    
    // Without any other elements with Context: 
    $('.myForm', '#someContainer') : 4137ms (3594ms) 
    $('form.myForm', '#someContainer') : 6627ms (4341ms) 
    
    // Without any other elements: 
    $('.myForm') : 4278ms (7303ms) 
    $('form.myForm') : 8353ms (4033ms) 
    
    +0

    वाह, 1.3 के लिए संदर्भ भूल जाओ !!साथ ही, यह दूसरे टेस्ट (संस्करणों के बीच) के लिए एक बहुत बड़ा अंतर है। ऐसा लगता है कि jquery form.myForm के लिए थोड़ी सी गति खो गया है, लेकिन .myForm के लिए भारी लाभ कुल मिलाकर एक बड़ा अंतर बना देगा। – enobrev

    -5

    लोग चलो भाग गया? क्या तुम पागल हो?

    $ ('। MyForm') जिस तरह से $ ('form.myform') क्योंकि दूसरा संस्करण ने यह सुनिश्चित करने के aditional जांच करने के लिए की तुलना में तेजी है: अधिकांश शीघ्र तरह से एक तत्व का चयन करने के सबसे छोटा रास्ता है कि तत्व निर्दिष्ट टैग नाम है। मई नया jquery 1.3 इस बात को बदल देगा, लेकिन नवीनतम स्थिर संस्करण पर, टैगनाम को भी निर्दिष्ट करना गलत है। आपको read here होना चाहिए।

    मुझे लगता है कि मैंने कहीं कहीं पढ़ा है कि म्यूटूल इस तरह से तेज है। खैर .. शायद मू में, पता नहीं, लेकिन jQuery में यह सबसे तेज़ तरीका है।

    इस प्रोफाइलर पर एक नज़र डालें: alt text

    (big pic)

    पहले ही आईडी के साथ है, दूसरा साथ प्रपत्र # आईडी (मेरे ब्लॉग पेज पर परीक्षण) और वर्ग चयनकर्ता के लिए बिल्कुल वैसा ही काम करते हैं ।

    +2

    टैग नाम से तत्वों की खोज कक्षा के नाम से तत्वों की खोज करने से तेज़ है। form.myForm का मतलब है कि आपको केवल तत्वों के छोटे सबसेट के माध्यम से खोजना होगा। यदि आपके पास केवल कुछ तत्व हैं, तो आप दो खोज कर रहे हैं और यह धीमा हो सकता है, लेकिन वास्तविक जीवन रूप में। मेराफॉर्म जीतता है। – nickf

    +0

    प्रोफाइलर परिणामों पर एक नज़र डालें (या अपने स्वयं के परीक्षण करें) तो मुझे यह बताएं। इसके अलावा, जॉन रेजिग ने भी इसकी पुष्टि की;) –

    +0

    भी, परीक्षण वास्तविक जीवन पर किया जाता है, न कि परीक्षण साइट पर। आप यह सुनिश्चित करने के लिए यहां भी कोशिश कर सकते हैं कि मैं सच कह रहा हूं :) –

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