2012-05-15 12 views
8

मेरे पास एक HTML तालिका है जो 1K पंक्तियों और एक दर्जन या उससे अधिक कॉलम हो सकती है।ओवरफ्लो की प्रदर्शन लागत से कैसे बचें: छुपा हुआ?

मैं कॉलम एक निश्चित आकार (उपयोगकर्ता द्वारा नियंत्रित करने योग्य) होना चाहता हूं और लंबवत या क्षैतिज रूप से बढ़ता/छोटा नहीं करता हूं। तो दृष्टि से एक विशेष टेबल सेल की सामग्री एक पंक्ति पर होगी और सेल के अंत में अतिप्रवाह काट दिया जाएगा।

बड़ी तालिका में क्रोम में प्रदर्शन विश्लेषण करना मुख्य प्रदर्शन हत्यारा अतिप्रवाह है: छुपा

मैंने इनपुट के अंदर प्रत्येक सेल की सामग्री डालने का प्रयास किया है, क्योंकि यह वही दृश्य व्यवहार दोहराएगा, लेकिन इसका एक समान प्रदर्शन प्रभाव है।

प्रदर्शन में सुधार करने के लिए लोग क्या सलाह देते हैं?

यदि आवश्यक हो तो मुझे टेबल टैग का उपयोग करने की आवश्यकता नहीं है, लेकिन यदि अच्छा प्रदर्शन प्राप्त किया जा सकता है तो तालिका टैग के साथ चिपकना पसंद करेंगे।

अद्यतन 1: मैंने एक फ़ाइल शामिल की है जो प्रदर्शन समस्या here प्रदर्शित करती है। चेतावनी फ़ाइल बहुत भारी (25 एमबी) है और आपके कंप्यूटर को धीमा कर देगी। डिफ़ॉल्ट रूप से तालिका में छिपाने के लिए अतिप्रवाह सेट नहीं होता है, और एक बार तालिका लोड हो जाने पर (थोड़ी देर लग सकती है) ब्राउज़र प्रदर्शन अपेक्षाकृत सुचारु रूप से।

हालांकि, अगर आप फ़ाइल और असम्बद्धता पंक्तियों को 12-15 संपादित करते हैं और फिर इसे खोलते हैं। तालिका के चारों ओर ब्राउज़र लोड करने के बाद आप देखेंगे काफी कम उत्तरदायी है।

+3

क्या कोई कारण है कि आप पेजिनेशन का उपयोग नहीं कर रहे हैं? –

+0

वास्तव में कई कारण हैं। मुख्य रूप से एक यूएक्स परिप्रेक्ष्य से। लेकिन आपके पास ऐसी स्थिति हो सकती है जहां आपके पास केवल 100 पंक्तियां हों और व्यक्ति धीमे कंप्यूटर पर हो। प्रदर्शन में सुधार से न केवल बहुत सारे डेटा वाले उपयोगकर्ताओं को फायदा होगा, बल्कि हर कोई। –

+0

क्या आप मार्कअप और शैलियों का नमूना पोस्ट कर सकते हैं जिनका आप उपयोग कर रहे हैं? यहां: https://gist.github.com/2705929 मैंने प्रति सेल 400+ वर्णों के साथ एक 12x1800 तालिका सेट की है। प्रदर्शन ठीक लगता है (हालांकि मैं धीमी मशीन पर नहीं हूं)। – Beejamin

उत्तर

1

पहले बंद, तालिका के लिए आवश्यक मार्कअप की मात्रा स्पष्ट रूप से divs का उपयोग करने से कहीं अधिक बड़ी है: एक नई पंक्ति के लिए दोनों सीएसएस। तो यह पहला प्रदर्शन हिट है।

भी, आप एक वर्ग के रूप में अतिप्रवाह सेट कर रहे हैं (?)

<style type="text/css"> .ovfl { overflow:hidden; }</style> 

    <td class="ovfl"></td> 

एक अलग रूप में के रूप में, 1000 पंक्तियाँ एक वजन वितरित करने के लिए है।

divs के साथ आपको कम से कम डिस्प्ले के साथ एक div में (स्क्रॉल से परे) को फेंकने का आसान अवसर होता है: कोई भी जब तक आगंतुक उन्हें स्क्रॉल नहीं करता है। बिल्ली ज्यादातर इस काम पर होने की संभावना को

कुछ खाल,

आशा कुछ अच्छे विचार किया था।

2

आप एक टाइल किए गए दृष्टिकोण का उपयोग करने का प्रयास कर सकते हैं। यह असीमित साइड स्क्रोल करने योग्य गेम की तरह चीजों को कुशलतापूर्वक बनाने के लिए एक सुंदर ठेठ दृष्टिकोण है।

अपने सभी डेटा को जावास्क्रिप्ट सरणी में रखें, और फिर उस तालिका में एन + 1 पंक्तियां हों जिसमें एन पंक्तियां दिखाई दें। जब आप नीचे स्क्रॉल करते हैं, तो आखिरी वस्तु दृश्य में चली जाएगी। फिलहाल आपने इतनी दूर तक स्क्रॉल किया है कि पहला आइटम दृश्य से बाहर निकलता है, आप सभी डेटा को एक पंक्ति में बदल देते हैं और स्क्रॉल स्थिति को फिर से शुरू करने के लिए रीसेट करते हैं। सही ढंग से हो गया, बदलाव उपयोगकर्ता के लिए पूरी तरह से पारदर्शी होगा। आप कभी भी एन-पंक्ति-दृश्य तालिका में एन + 1 पंक्तियों के साथ काम करेंगे।

मैंने पहले यह किया है, लेकिन बहुत विशिष्ट यूआई बाधाओं के तहत। अंतर्निहित ब्राउज़र स्क्रॉलबार और इस तरह का उपयोग करके इस संगत बनाने के विचार पर मैं शटर का प्रकार हूं।

3

FYI: मैंने आईपैड/आईओएस पर इस समस्या को एक पृष्ठ के साथ प्रदर्शन समस्याओं का सामना किया है जिसमें तालिका-लेआउट के साथ तालिका में सौ पंक्तियां हैं: निश्चित।

जैसे ही सेल या सेल में एक div, एक विशेषता प्राप्त होती है जो इसे सेल को व्यक्तिगत रूप से खींचा जाने के लिए मजबूर करती है, इसमें 100ms के बजाय लगभग 300ms लगते हैं (जिससे यूआई को मेरे लिए धीमी गति से महसूस होता है परिस्थिति)।

या तो दो गुणों में से कोई भी (position:relative या overflow:hidden) ने मेरे लिए समस्या का कारण बना दिया, उन्हें गति को अनुकूलित करने के लिए हटा दिया, लेकिन सेल टेक्स्ट टेक्स्ट निश्चित चौड़ाई कॉलम के लिए बहुत व्यापक था।

मंदी के बाद भी मंदी हो रही थी, क्योंकि मैं गतिशील रूप से तालिका पर एक पूर्ण div को पॉप अप कर रहा हूं। जावास्क्रिप्ट प्रोफाइलिंग करते समय ((new Date).getTime() का उपयोग करके), जावास्क्रिप्ट में स्थानों में मापा जाने वाला मंदी जिसमें टेबल के साथ कुछ लेना देना नहीं है।

:

  1. एक span तत्व के अंदर सभी सेल सामग्री रखो [संपादित करें जोड़ा हिस्सा समाधान के रूप में निम्नलिखित] (ताकि ब्लॉक तत्व से युक्त की चौड़ाई सामग्री के offsetWidth बजाय माप सकते हैं)।
  2. दस्तावेज़ में पंक्ति को जोड़ने के बाद, परीक्षण करें कि प्रत्येक span.offsetWidth कॉलम चौड़ाई से अधिक है, यदि ऐसा है तो युक्त ब्लॉक के "ओवरफ्लो: छुपा" शैली में (या कक्षा के माध्यम से) जोड़ें।
  3. कुछ स्तंभों के लिए ऊपर 1 और 2 छोड़ सकते हैं (यदि यह ज्ञात है कि सेल सामग्री को क्लिपिंग की आवश्यकता नहीं होगी)।

चेतावनियां:

  1. माप केवल (मैं किसी भी अन्य ब्राउज़र प्रोफ़ाइल नहीं था) iOS5 सफारी के लिए बनाया है।
  2. हमारे लिए काम करता है क्योंकि हम गतिशील रूप से तालिका पंक्तियां बनाते हैं (जावास्क्रिप्ट का उपयोग करके अपना उदाहरण संसाधित करना धीमा होगा?)।
  3. हमारे डेटा के लिए अधिकांश कोशिकाएं बहती नहीं हैं (क्लिपिंग केवल थोड़ी-थोड़ी आवश्यक है - केवल सीमित संख्या में कोशिकाओं)।
  4. समझौता प्रारंभिक पृष्ठ लोड (पृष्ठ में तालिका का उत्पादन 80ms से 800ms तक चला गया)।
  5. लेकिन गतिशील कॉम्बो पॉपअप (340ms से 130ms तक) को बढ़ाकर बेहतर कीबोर्ड प्रतिक्रिया प्रदान की गई। केवल स्तंभों पर छिपा हुआ है, जहां स्तंभ के offsetWidth पिक्सेल चौड़ाई से अधिक है:

अपनी स्थिति के लिए, पहली,, परिवर्तनीय चौड़ाई स्तंभों का उपयोग सभी स्तंभों के offsetWidth मापने पिक्सेल चौड़ाई लिए कॉलम की चौड़ाई की स्थापना और अतिप्रवाह स्थापित करने के लिए तेजी से हो सकता है आप कॉलम के लिए उपयोग करेंगे।

1

Webkit bug 75001 इस समस्या से संबंधित है और इसमें इसे हल करने के लिए किए जा रहे कार्यों को शामिल किया गया है (जानकारी के लिए बगजिला निर्भरता भी देखें)।

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