2012-01-19 11 views
7

इस पेज के लेखक: http://24ways.org/2011/your-jquery-now-with-less-suck का दावा है कि jQuery चयनकर्ता $('#id').find('p')$('#id p') तेजी से है , हालांकि यह संभवतः एक ही परिणाम उत्पन्न करता है यदि मैं सही ढंग से समझता हूं। इस अंतर का कारण क्या है?

+0

क्या आपने इसका परीक्षण भी किया था? – Tomalak

उत्तर

6

क्योंकि $('#id').find('p') करने के लिए अनुकूलित है ...

document.getElementById('id').getElementsByTagName('p'); 

... जबकि मैं $('#id p') अनुमान लगा रहा हूँ या तो querySelectorAll का उपयोग करेगा, यदि उपलब्ध हो, या JavaScript आधारित चयनकर्ता इंजन नहीं तो।


आपको ध्यान रखना चाहिए कि प्रदर्शन में ब्राउज़र के बीच हमेशा भिन्नता होती है। ओपेरा को बेहद तेज querySelectorAll माना जाता है।

इसके अलावा, jQuery के विभिन्न संस्करण विभिन्न अनुकूलन के साथ आ सकते हैं।

यह हो सकता है कि $('#id p')(या वर्तमान में) को पहले संस्करण के समान अनुकूलन दिया जाएगा।

+0

मुझे लगता है कि 'querySelectorAll (' # id p ')' भी बहुत अनुकूलित है। प्रदर्शन मतभेदों का परीक्षण किया जाना चाहिए, जोर नहीं दिया। – Tomalak

+1

@ टोमालक: मैंने यह जानने के लिए 'qSA' का पर्याप्त परीक्षण किया है कि अधिकांश ब्राउज़रों में यह वास्तव में तुलना में काफी धीमी है। यह एक यादृच्छिक दावा नहीं है। * ओपेरा * के बारे में मेरा अपडेट देखें। –

+0

मैंने यह नहीं कहा कि क्यूएसए हमेशा तेज होगा। मैंने कहा, "मैं मानता हूं" * वास्तव में, मेरे बिंदु को साबित करने के लिए। आखिरकार, jQuery और ब्राउज़र संस्करणों में व्यापक मतभेदों के कारण, इस तरह के एक सामान्यीकृत कथन को एक तरफ या दूसरे का समर्थन करना बहुत मुश्किल है। – Tomalak

2

यह ब्राउज़र विशिष्ट है क्योंकि jQuery उपलब्ध होने पर querySelectorAll का उपयोग करता है। जब मैंने वेबकिट में परीक्षण किया तो यह वास्तव में तेज़ था। चूंकि यह querySelectorAll को इस मामले के लिए अनुकूलित किया गया है।

वेबकिट के अंदर, यदि संपूर्ण चयनकर्ता #<id> है और उस आईडी के साथ दस्तावेज़ में केवल एक तत्व है, तो इसे getElementById पर अनुकूलित किया गया है। लेकिन, अगर चयनकर्ता कुछ और है, querySelectorAll दस्तावेज को उन तत्वों की तलाश करता है जो मेल खाते हैं।

हाँ, इस मामले को अनुकूलित करना संभव होना चाहिए ताकि वे वही कर सकें - लेकिन अभी, कोई भी नहीं है। getElementById का उपयोग करना है या नहीं, यह तय करने के लिए आप SelectorDataList::canUseIdLookup का उपयोग करते हैं, SelectorDataList::execute में आप इसे here देख सकते हैं। यह इस तरह दिखता है:

if (m_selectors.size() != 1) 
    return false; 
if (m_selectors[0].selector->m_match != CSSSelector::Id) 
    return false; 
if (!rootNode->inDocument()) 
    return false; 
if (rootNode->document()->inQuirksMode()) 
    return false; 
if (rootNode->document()->containsMultipleElementsWithId(m_selectors[0].selector->value())) 
    return false; 
return true; 

आप एक गैर वेबकिट ब्राउज़र में परीक्षण किया गया है, तो यह है कि यह समान अनुकूलन याद आ रही है संभव है।

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