2009-06-12 5 views
6

मुझे कोड स्निपेट न देने के लिए माफ़ी मांगना शुरू करें। जिस परियोजना पर मैं काम कर रहा हूं वह स्वामित्व है और मुझे डर है कि मैं बिल्कुल जो मैं काम कर रहा हूं, दिखा नहीं सकता। हालांकि, मैं वर्णनात्मक होने के लिए अपनी पूरी कोशिश करूंगा।jQuery को खाली करना() या प्रतिस्थापित करें() फ़ंक्शन जब बड़े डोम तत्वों के साथ काम करते हैं

यहाँ अपने आवेदन में पर चला जाता है के टूटने है:

  1. उपयोगकर्ता एक बटन क्लिक करता है
  2. सर्वर एक डेटा-तालिका के रूप में चित्रों की सूची को पुन: प्राप्त
  3. तालिका की प्रत्येक पंक्ति 8 डेटा-कोशिकाओं है कि बदले में हर एक हाइपरलिंक
    • उपयोगकर्ता द्वारा प्रत्येक अनुरोध अधिकतम 50 पंक्तियां हो सकते हैं शामिल हैं (मैं इस नंबर बदल सकते हैं यदि आवश्यकता हुई)
    • इसका मतलब है कि तालिका 800 व्यक्तिगत डीओएम तत्वों के ऊपर है
    • मेरा विश्लेषण दिखाता है कि jQuery("#dataTable").empty() और jQuery("#dataTable).replaceWith(tableCloneObject) मेरे समग्र प्रसंस्करण समय का 9 7% लेते हैं और इसे पूरा करने के लिए औसतन 4-6 सेकंड लेते हैं।/प्रतिस्थापित

मैं उपर्युक्त jQuery कार्यों जब बड़े पैमाने पर डोम तत्वों को हटाया जा करने की जरूरत है के साथ काम कर के दोनों तेजी लाने के लिए एक रास्ता तलाश कर रहा हूँ। मुझे उम्मीद है कि मेरी व्याख्या मदद करता है।

उत्तर

8

jQuery empty() अपनी मेज पर एक लंबे समय ले रही है, क्योंकि यह मेमोरी लीक को रोकने के हित में खाली कर दिया तत्व की सामग्री के साथ काम का एक सही मायने में स्मारकीय राशि करता है। आपको लगता है कि जोखिम के साथ रह सकते हैं, तो आप तर्क शामिल छोड़ सकते हैं और सिर्फ बात यह है कि इतने तरह तालिका सामग्री से छुटकारा हो जाता है:

while (table.firstChild) 
     table.removeChild(table.firstChild); 

या

table.children().remove(); 
+0

यह काम किया। मैं संभावित मेमोरी लीक के बारे में और अधिक काम करूँगा लेकिन यह पूरी तरह से चीजों को बढ़ा देता है। आप सभी को धन्यवाद! –

+0

पहला तरीका काम करता था, दूसरा नहीं, जो अभी भी मुझे बड़ी टेबल (50k पंक्तियों) पर एक ढेर ओवरफ्लो देता है। – Nico

0

क्या आपको एक बार में सभी को दोबारा बदलना है, या आप इसे सेटटाइमआउट() पर भाग से कर सकते हैं? मुझे एहसास है कि यह शायद भाग में और भी अधिक समय लेगा, लेकिन उपयोगकर्ता के लिए एक स्पष्ट लॉक अप के बजाय कुछ घटित होने के लिए बहुत कुछ है।

+0

इसे सभी एक साथ किया जाना है। –

2

मेरे पास हाल ही में बहुत बड़ी डेटा-टेबल थीं जो सभी डीओएम मैनिपुलेशन के कारण परिवर्तन करते समय प्रसंस्करण के एक मिनट में 15 सेकंड तक खाती थीं। मैं इसे सभी ब्राउज़रों में < 1 सेकंड तक मिला लेकिन आईई (आईई 8 में 5-10 सेकंड लगते हैं)।

मुझे पाया गया सबसे बड़ा गति लाभ डोम से काम कर रहा था, जो मेरे परिवर्तन में प्रदर्शन कर रहा था, फिर इसे वापस डोम में वापस कर रहा था (मेरे मामले में tbody)।

यहां आप कोड की दो प्रासंगिक रेखाएं देख सकते हैं, जिन्होंने मुझे बड़ा प्रदर्शन बढ़ाया (मुट्टूल का उपयोग करके, लेकिन jQuery पर पोर्ट किया जा सकता है)।

update_table : function(rows) { 
    var self = this; 
    this.body = this.body.dispose(); //<------REMOVED HERE 
    rows.each(function(row) { 
     var active = row.retrieve('active'); 
     self.options.data_classes.each(function(hide, name) { 
      if (row.retrieve(name) == true && hide == true) { 
       active = false; 
      } 
     }); 
     row.setStyle('display', (active ? '' : 'none')); 
     row.store('active', active); 
     row.inject(self.body); //<--------CHANGES TO TBODY DONE HERE 
    }) 
    this.body.inject(this.table); //<-----RE-INSERTED HERE 
    this.rows = rows; 
    this.zebra(); 
    this.cells = this._update_cells(); 
    this.fireEvent('update'); 
}, 
+0

ठीक है, मैं इसमें तर्क देख सकता हूं। हालांकि, मेरे मामले में, मैं मूल रूप से के भीतर से एक तालिका को हटा रहा हूं। आपको लगता है कि इसमें अधिक समय नहीं लगेगा, लेकिन के अंदर की तालिका में 800 से अधिक तत्व हैं। इस परिदृश्य को देखते हुए, क्या आपको लगता है कि आपका प्रस्तावित समाधान अभी भी काम करेगा? –

+1

मैं करता हूं। वे इस समस्या से निपटने के लिए एचटीएमएल 5 में डीओएम टुकड़े पेश कर रहे हैं। मुझे लगता है कि यदि आप खींचने का प्रयास कर रहे हैं, इसे अपडेट कर रहे हैं, और इसे वापस डालने में आपको भारी प्रदर्शन लाभ दिखाई देगा। इसके अलावा यह करना बहुत आसान है, मैंने कोड की 2 लाइनों के साथ परिवर्तन किया है। यदि आपके पास फ़ायरबग इंस्टॉल है तो आप 'कंसोल' टैब के नीचे 'प्रोफाइल' बटन का उपयोग करके यह देखने के लिए देख सकते हैं कि आपका प्रदर्शन कहां खा रहा है। – tj111

-1

क्या मेरे लिए काम किया $("#myTable").detach() है । मुझे एक टेबल साफ़ करना पड़ा जिसमें पंक्तियों के 1000s हैं। मैंने $("#myTable").children().remove() की कोशिश की। यह $("myTable").empty() पर एक सुधार था, लेकिन अभी भी बहुत धीमी है। $("#myTable").detach() 1 सेकंड या उससे कम लेता है। एफएफ और क्रोम में ठीक काम करता है। आईई अभी भी धीमा है।

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