2009-04-13 15 views
5

चूंकि मैं एक jQuery परीक्षण का उपयोग कर jQuery 1.3+ का उपयोग करता हूं, इसका उपयोग कर रहा है। दूसरा सादा जावास्क्रिप्ट है जिसे मैंने 2000 में वापस पाया था। मैंने उस मार्ग पर जाना बंद कर दिया क्योंकि परीक्षण चलाने के लिए लगभग 150 सेकंड लग रहे थे। मैंने कुछ jQuery ऑप्टिमाइज़ेशन वेब पेज पढ़े हैं जो एक तत्व का चयन करने से संबंधित हैं। इसका उपयोग करने के लिए '#id' सबसे अच्छा मामला है, लेकिन अब मेरे पास का मुद्दा है जो एक चेक बॉक्स में सभी कॉलबॉक्स को एक बड़ी तालिका में चेक करता है जिसमें एकाधिक चेकबॉक्स कॉलम हैं।बड़ी संख्या में चेकबॉक्स का चयन करने और उन्हें चुनने का सबसे तेज़ तरीका क्या है?

मैंने जो किया है वह एक पृष्ठ सेटअप है जो दो चेक बॉक्स कॉलम के साथ 20,000 टेबल पंक्तियां बनाता है। लक्ष्य दूसरे कॉलम को जांचना है कि कितना समय लगा, और फिर उन्हें अनचेक करें और देखें कि कितना समय लगेगा। जाहिर है हम सबसे कम समय चाहते हैं। मैं केवल आईई 6 और 7 का उपयोग कर रहा हूं और मेरे मामले में मेरे सभी उपयोगकर्ता वही कर रहे होंगे।

20,000 पंक्तियां आप कहते हैं? मैंने यही भी कहा, लेकिन यह उत्पादन (मेरे हाथों से बाहर) जा रहा है और अब इसे बदलने में बहुत देर हो चुकी है। मैं बस घड़ी पर 1 सेकंड के साथ एक गेल मैरी फेंकने की कोशिश कर रहा हूँ। इसके अलावा, मैंने सीखा है कि input.chkbox सबसे तेज़ चयनकर्ता नहीं है (आईई 7 के लिए)! :)

सवाल यह है कि, क्या यह jQuery या अन्यथा करने का एक बेहतर तरीका है? मैं इसे अपनी मशीन पर आधे सेकेंड से भी कम समय में चलाने के लिए प्यार करता हूँ।

<form id="form1" runat="server"> 
<div>   
     <a href="#" id="one">input[id^='chkbox'][type='checkbox']</a><br /> 
     <a href="#" id="two">#myTable tr[id^='row'] input[id^='chkbox'][type='checkbox']</a><br /> 
     <a href="#" id="three">#myTable tr.myRow input[id^='chkbox'][type='checkbox']</a><br /> 
     <a href="#" id="four">tr.myRow input[id^='chkbox'][type='checkbox']</a><br /> 
     <a href="#" id="five">input[id^='chkbox']</a><br /> 
     <a href="#" id="six">.chkbox</a><br /> 
     <a href="#" id="seven">input.chkbox</a><br /> 
     <a href="#" id="eight">#myTable input.chkbox</a><br /> 

     <a href="#" id="nine">"input.chkbox", "tr"</a><br /> 
     <a href="#" id="nine1">"input.chkbox", "tr.myRow"</a><br /> 
     <a href="#" id="nine2">"input.chkbox", "#form1"</a><br /> 
     <a href="#" id="nine3">"input.chkbox", "#myTable"</a><br /> 

     <a href="#" id="ten">input[name=chkbox]</a><br /> 
     <a href="#" id="ten1">"input[name=chkbox]", "tr.myRow"</a><br /> 
     <a href="#" id="ten2">"input[name=chkbox]", "#form1"</a><br /> 
     <a href="#" id="ten3">"input[name=chkbox]", "#myTable"</a><br /> 

     <a href="#" id="ten4">"input[name=chkbox]", $("#form1")</a><br /> 
     <a href="#" id="ten5">"input[name=chkbox]", $("#myTable")</a><br /> 

     <a href="#" id="eleven">input[name='chkbox']:checkbox</a><br /> 
     <a href="#" id="twelve">:checkbox</a><br /> 
     <a href="#" id="twelve1">input:checkbox</a><br /> 
     <a href="#" id="thirteen">input[type=checkbox]</a><br /> 

     <div> 
      <input type="text" id="goBox" /> <button id="go">Go!</button> 
      <div id="goBoxTook"></div> 
     </div> 

     <table id="myTable"> 
      <tr id="headerRow"><th>Row #</th><th>Checkboxes o' fun!</th><th>Don't check these!</th></tr> 
      <% for(int i = 0; i < 20000;i++) { %> 
      <tr id="row<%= i %>" class="myRow"> 
       <td><%= i %> Row</td> 
       <td> 
        <input type="checkbox" id="chkbox<%= i %>" name="chkbox" class="chkbox" /> 
       </td> 
       <td> 
        <input type="checkbox" id="otherBox<%= i %>" name="otherBox" class="otherBox" /> 
       </td> 
      </tr> 
      <% } %> 
     </table> 
</div> 
     <script type="text/javascript" src="<%= ResolveUrl("~/") %>Javascript/jquery.1.3.1.min.js"></script> 
     <script type="text/javascript"> 

      $(function() {     
       function run(selectorText, el) {      
        var start = new Date();      
        $(selectorText).attr("checked", true);        
        var end = new Date(); 
        var timeElapsed = end-start; 
        $(el).after("<br />Checking Took " + timeElapsed + "ms"); 

        start = new Date();      
        $(selectorText).attr("checked", false);        
        end = new Date(); 
        timeElapsed = end-start; 
        $(el).after("<br />Unchecking Took " + timeElapsed + "ms"); 
       }  

       function runWithContext(selectorText, context, el) {      
        var start = new Date();      
        $(selectorText, context).attr("checked", true);        
        var end = new Date(); 
        var timeElapsed = end-start; 
        $(el).after("<br />Checking Took " + timeElapsed + "ms"); 

        start = new Date();      
        $(selectorText, context).attr("checked", false);         
        end = new Date(); 
        timeElapsed = end-start; 
        $(el).after("<br />Unchecking Took " + timeElapsed + "ms"); 
       } 

       $("#one").click(function() {       
        run("input[id^='chkbox'][type='checkbox']", this); 
       }); 

       $("#two").click(function() { 
        run("#myTable tr[id^='row'] input[id^='chkbox'][type='checkbox']", this); 
       }); 

       $("#three").click(function() { 
        run("#myTable tr.myRow input[id^='chkbox'][type='checkbox']", this); 
       }); 

       $("#four").click(function() { 
        run("tr.myRow input[id^='chkbox'][type='checkbox']", this); 
       }); 

       $("#five").click(function() { 
        run("input[id^='chkbox']", this); 
       }); 

       $("#six").click(function() { 
        run(".chkbox", this); 
       }); 

       $("#seven").click(function() { 
        run("input.chkbox", this); 
       }); 

       $("#eight").click(function() { 
        run("#myTable input.chkbox", this); 
       }); 

       $("#nine").click(function() { 
        runWithContext("input.chkbox", "tr", this); 
       }); 


       $("#nine1").click(function() { 
        runWithContext("input.chkbox", "tr.myRow", this); 
       }); 
       $("#nine2").click(function() { 
        runWithContext("input.chkbox", "#form1", this); 
       }); 
       $("#nine3").click(function() { 
        runWithContext("input.chkbox", "#myTable", this); 
       }); 

       $("#ten").click(function() { 
        run("input[name=chkbox]", this); 
       });     

       $("#ten1").click(function() { 
        runWithContext("input[name=chkbox]", "tr.myRow", this); 
       }); 

       $("#ten2").click(function() { 
        runWithContext("input[name=chkbox]", "#form1", this); 
       }); 

       $("#ten3").click(function() { 
        runWithContext("input[name=chkbox]", "#myTable", this); 
       }); 

       $("#ten4").click(function() { 
        runWithContext("input[name=chkbox]", $("#form1"), this); 
       }); 

       $("#ten5").click(function() { 
        runWithContext("input[name=chkbox]", $("#myTable"), this); 
       }); 

       $("#eleven").click(function() { 
        run("input[name='chkbox']:checkbox", this); 
       }); 

       $("#twelve").click(function() { 
        run(":checkbox", this); 
       }); 

       $("#twelve1").click(function() { 
        run("input:checkbox", this); 
       }); 

       $("#thirteen").click(function() { 
        run("input[type=checkbox]", this); 
       }); 

       $('#go').click(function() { 
        run($('#goBox').val(), this); 
       }); 
      }); 
     </script> 
</form> 
:

Updated सुबह 4/14 आगे समय परीक्षणों को शामिल करने के:

तो तुम सब बकवास मैं पहले से ही यहाँ किया है फिर से लिखें की जरूरत नहीं है परीक्षण सामान मैं के साथ आया है

+0

मुझे असहनीय होने का मतलब नहीं है, लेकिन एक पृष्ठ में 20k पंक्तियां केवल खराब डिज़ाइन हैं। आपको इसे ठीक करना चाहिए। :) –

+0

अच्छा ... कोई मजाक नहीं। :) मैंने यह नहीं किया! अभी इस रिलीज के लिए इसे ठीक करने के लिए पर्याप्त समय नहीं है। अगली रिलीज पर यह पहली बात होगी। इस परियोजना ने अभी तक कई "रोचक" चुनौतियों का सामना किया है। – rball

उत्तर

8

इनपुट [name = chkbox] आईई 7 के तहत मेरी मशीन पर सबसे तेज़ jQuery चयनकर्ता के रूप में आ रहा है।

Unchecking Took 2453ms 
Checking Took 2438ms 
Unchecking Took 2438ms 
Checking Took 2437ms 
Unchecking Took 2453ms 
Checking Took 2438ms 

input.chkbox और ...

Unchecking Took 2813ms 
Checking Took 2797ms 
Unchecking Took 2797ms 
Checking Took 2797ms 
Unchecking Took 2813ms 
Checking Took 2797ms 

इनपुट: checkbox.chkbox

Unchecking Took 2797ms 
Checking Took 2797ms 
Unchecking Took 2813ms 
Checking Took 2781ms 

.chkbox लगभग के दोगुने लेता बंधे लगते input.chkbox

Unchecking Took 4031ms 
Checking Took 4062ms 
Unchecking Took 4031ms 
Checking Took 4062ms 

पाश के लिए जावास्क्रिप्ट दूर सबसे खराब पर आ कर रहा है:

Checking Took 149797ms 

150 सेकंड! यह ब्राउज़र को भी लॉक करता है। यह सिर्फ मुझे jQuery के साथ वास्तव में प्रभावित करता है। मैं ईमानदारी से यह धीमी होने की उम्मीद नहीं की थी। शायद क्योंकि मैं प्रत्येक व्यक्तिगत तत्व में गुजर रहा हूं जिसे इसे ढूंढना है ...

यह रूप में अच्छी तरह से मेरे लिए बहुत दिलचस्प था:

इनपुट [आईडी^= 'chkbox']

Unchecking Took 3031ms 
Checking Took 3016ms 

से ले लिया कम समय:

इनपुट [आईडी^= 'chkbox'] [type = 'checkbox']

Unchecking Took 3375ms 
Checking Took 3344ms 

मैंने सोचा कि चूंकि मैंने अधिक फ़िल्टर पोस्ट किए हैं, यह तेज़ी से होगा। नहीं!

चेकबॉक्स लिए और भी अधिक पथ निर्दिष्ट बनाता है यह रास्ता धीमी:

#myTable टीआर [आईडी^= 'पंक्ति'] इनपुट [आईडी^= 'chkbox'] [type = 'चेकबॉक्स']

Checking Took 10422ms 

यह दूसरी अनचेक भी नहीं चला क्योंकि उसने मुझसे पूछा कि क्या मैं अपने कंप्यूटर पर चल रही स्क्रिप्ट जारी रखना चाहता हूं। पागल! : पी

अद्यतन सुबह 4/14:

किसी लाया संदर्भ की स्थापना: मैं वास्तव में उन और मेरे आश्चर्य करने और के खिलाफ ज्यादा के कुछ ही क्या बहुत से लोगों को वेब पर कहा है किया आईई 7 पर ये धीमे थे!

"input.chkbox", "tr"

Checking Took 8546ms 

"input.chkbox", "टीआर: यहाँ बार मैं कुछ अलग संदर्भ के निर्दिष्ट तेज चयनकर्ता के ऊपर के साथ रखा के साथ मिला कर रहे हैं .myRow "

Checking Took 8875ms 

" input.chkbox "," # Form1 "

Unchecking Took 3032ms 
Checking Took 3000ms 

"input.chkbox", "#myTable"

Unchecking Took 2906ms 
Checking Took 2875ms 

वर्तमान विजेता (अभी भी): इनपुट [नाम = chkbox]

Unchecking Took 2469ms 
Checking Took 2453ms 

"इनपुट [नाम = chkbox] "," tr।myRow "

Checking Took 9547ms 

" इनपुट [नाम = chkbox] "," # Form1 "

Unchecking Took 3140ms 
Checking Took 3141ms 

" इनपुट [नाम = chkbox] "," #myTable "

Unchecking Took 2985ms 
Checking Took 2969ms 

अद्यतन 2 सुबह 4/14

सोचा कि मैंने http://beardscratchers.com/journal/jquery-its-all-about-context से एक वाक्यविन्यास अंतर देखा है, तो मैंने सोचा होगा। ऐसा लगता है कि ये के समान नहीं हैं, वे थोड़ा बेहतर समय दे रहे हैं, लेकिन फिर भी गैर-संदर्भित चयनकर्ता - डर्न को हरा नहीं है।

"इनपुट [नाम = chkbox]", $ ("# Form1")

Unchecking Took 3078ms 
Checking Took 3000ms 
Unchecking Took 3078ms 
Checking Took 3016ms 

"इनपुट [नाम = chkbox]", $ ("# mytable")

Unchecking Took 2938ms 
Checking Took 2906ms 
Unchecking Took 2938ms 
Checking Took 2921ms 

अद्यतन 3 सुबह 4/14

रस मुझे इन बाहर की कोशिश करना चाहता था, वे डी/सभी बो चयन XES लेकिन फिर से यह दिलचस्प था:

: चेकबॉक्स

Unchecking Took 8328ms 
Checking Took 6250ms 

इनपुट: चेकबॉक्स

Unchecking Took 5016ms 
Checking Took 5000ms 

-> सबसे तेजी से?!?! इनपुट [प्रकार = चेकबॉक्स]

Unchecking Took 4969ms 
Checking Took 4938ms 

तथ्य तिहाई है कि वहाँ सबसे तेजी के रूप में है कि मैं क्या सोचा होगा के खिलाफ जाता है काफी रोचक है। क्यों नहीं (कम से कम आईई 7 के लिए): चेकबॉक्स बस तेज समय प्राप्त करने के लिए टाइप = चेकबॉक्स का उपयोग करें? ये वास्तव में करीबी स्कोर हैं लेकिन जांच में 62 मिनट कम समय लगा। इसके अलावा, पहले दो अलग क्यों हैं? क्या इनपुट के अलावा कोई अलग तत्व है जिसमें चेकबॉक्स हो सकता है?

+0

अधिक चयन मानदंड एक क्वेरी को तेज नहीं करते हैं जब तक कि प्रत्येक सेट आकार को कम नहीं करता है। चूंकि सभी चेकबॉक्स टेबल पंक्तियों में हैं और इनपुट हैं, उन्हें मानदंड के रूप में जोड़ने से मदद नहीं मिलती है। –

+0

"मैंने सोचा था क्योंकि मैंने अधिक फ़िल्टर पोस्ट किए हैं, यह तेज़ होगा।" जैसा कि ज़ैन ने कहा, अधिक फ़िल्टर = अधिक चेक = अधिक प्रसंस्करण = अधिक समय। जब तक प्रत्येक फ़िल्टर अगले फ़िल्टर के लिए सेट आकार को कम कर देता है, तो यह केवल चक्र ले रहा है। – nickf

5

मैंने इसका परीक्षण नहीं किया है, लेकिन आप पेज लोड पर चेकबॉक्स संदर्भों के सरणी [] का निर्माण करने का प्रयास कर सकते हैं, फिर हर बार जब आप कोई बदलाव करना चाहते हैं तो फिर से शुरू करें?

आप पेज लोड पर प्रदर्शन लागत का भुगतान करेंगे, लेकिन प्रत्येक बार डोम चलने से तेज हो सकता है। अरे, कम से कम आप उपयोगकर्ता 'डाउन टाइम' में भारी उठाने का प्रयास करेंगे (लोगों को ढूंढने में कितना समय लगता है और अचयनित/चयन विकल्पों पर क्लिक करें)।

+0

या मुझे आश्चर्य है अगर आप पहली बार (या लोड पर) एक सरणी में उन्हें "कैश" कर सकता है, और फिर इसे जब वे इसे फिर से मारा तेज होगी। अच्छा विचार, मैं इसे जाने दूंगा। – rball

+0

मुझे बताएं कि आप कैसे चलते हैं! – Codebrain

+0

करेगा, लेकिन कल हो सकता है, क्योंकि कार्य दिवस लगभग समाप्त हो गया है। – rball

2

मेरा एकमात्र सुझाव शायद काम नहीं करेगा। ब्राउज़र स्विच करें। लेकिन मैंने केवल एक कंपनी को वास्तव में उस से सहमत किया है। हमने कंपनी को फ़ायरफ़ॉक्स पर स्विच किया था, और विशिष्ट उपयोगकर्ता Google क्रोम पर जाते हैं। आईई जावास्क्रिप्ट के साथ बहुत धीमी है।

इसके अलावा, आप jquery क्वेरी सूची को प्री-कैशिंग करने का प्रयास कर सकते हैं।

यदि अन्य सभी विफल हो जाते हैं, तो मनोविज्ञान के साथ इसे हल करें। इसका मतलब है कि उपयोगकर्ता को यह बताएं कि कुछ समय लगेगा। फ़ंक्शन प्रदर्शन करते समय "कृपया प्रतीक्षा करें" div डाल दें। इस तरह उपयोगकर्ता जानता है कि ब्राउज़र अभी लॉक नहीं हुआ है, और वे जानते हैं कि वे काम पर वापस आ सकते हैं। मेरे पास बस इतना ही धीमा पृष्ठ "हल" हुआ है।

+0

लॉल, हाँ बस होने वाला नहीं है। मैं आईई 7 का उपयोग करने में सक्षम होने के लिए "भाग्यशाली" हूं। आईई 6 का उपयोग करने के लिए हर किसी को जरूरी है। मैं प्री-कैशिंग में देखता हूं। – rball

+0

एक और विकल्प ... आप चेक सेट करने के लिए JQuery विशेषता मैनिपुलेशन का उपयोग कर रहे हैं: $ (selectorText) .attr ("चेक", झूठा); तुम भी $ (selectorText) .प्रत्येक की कोशिश कर सकते (function() {this.checked = false}); कोई गारंटी है, लेकिन यह एक शॉट के लायक हो सकता है। –

+0

ऐसा करने का विचार। मैं इसे आज़मा दूंगा और देखें कि क्या होता है। हम वास्तव में प्रतीक्षा कर रहे हैं कृपया प्रतीक्षा करें, 150 सेकंड पहले, लेकिन इसे 2-3 तक नीचे ले जाना बहुत अच्छा होगा। – rball

1

आप एक context साथ jQuery चयनकर्ताओं की कोशिश की है कि अगर प्रदर्शन में सुधार देखने के लिए है? संभवतः नियंत्रण एएसपी.नेट फॉर्म के अंदर होंगे, और शायद एक और विशिष्ट पहचान योग्य तत्व?

उदाहरण के लिए, जहां आप

$("input[id^='chkbox']") 

संदर्भ पर

$("input[id^='chkbox']", "#myFormID") 

Here's a BeardScratchers article साथ प्रयास करें

संपादित करें:

आपके अपडेट के बाद यह 2.45- की तरह लगता है 6 सेकंड हो सकता है कि आप अपनी परिस्थितियों को देखते हुए सबसे तेज़ हो सकें।

बस संपूर्णता के लिए

, तो आपको निम्न चयनकर्ताओं की कोशिश की?

$(':checkbox') 
$('input[type=checkbox]') 
+0

धीमे होने लगता है। हो सकता है कि मुझे अभी तक "सही" संदर्भ नहीं मिला है ... – rball

+0

परिणाम के साथ अद्यतन पोस्ट। – rball

+0

रुको ... पूरा लेख पढ़ें, ऐसा लगता है कि मैं संदर्भ गलत प्रदान कर रहा हूं ?? – rball

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

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