2012-07-14 29 views
5

मैं जहाँ मैं कुछ पृष्ठों की जानकारी ताज़ा करने के लिए जावास्क्रिप्ट समारोह setInterval() के साथ ajax अनुरोध करना है एक .NET वेब अनुप्रयोग विकसित कर रहा हूँ की स्मृति consum बढ़ जाती है।जावास्क्रिप्ट setInvertal का उपयोग करते हुए सीपीयू

प्रत्येक ajax अनुरोध के साथ

मैं लगभग 68 KB का एक्सएमएल प्रतिक्रिया है कि मैं jQuery के माध्यम से html में दृश्य परिवर्तन करने के लिए प्रबंधन प्राप्त करते हैं। मैंने 2000 मिलीसेकेंड के अंतराल सेट लेकिन मैं चाहते हैं, या कहें, मैं 1000 एमएस करने के लिए इसे कम करने की जरूरत करने जा रहा हूँ।

दुर्भाग्य से, प्रत्येक के साथ सीपीयू बढ़ जाती है की स्मृति consum का अनुरोध करते हैं और इस भड़काती है कि ब्राउज़र अवरुद्ध हो जाता है और उपयोगकर्ता इसे उपयोग नहीं कर सकते जब तक कि वह पृष्ठ को पुनः लोड। मैंने फ़ायरफ़ॉक्स, इंटरनेट एक्सप्लोरर और क्रोम में इसका परीक्षण किया है लेकिन परिणाम हमेशा एक जैसा है। अगर मैं setInvertal() नहीं करता, तो समस्या गायब हो जाती है।

इसके अलावा, मैं अपने सभी जावास्क्रिप्ट चर के दायरे का परीक्षण कर रही है, लेकिन मैंने कुछ गलत नहीं पाया है और मुझे लगता है कि जावास्क्रिप्ट एक कुशल कचरा कलेक्टर उन्हें साफ करने के लिए है।

मुझे आशा है कि मैं स्पष्ट समझा दिया है मुद्दा। क्या किसी को इसका समाधान करने का कोई विचार है?

संशोधित: मैं jQuery ढांचे का उपयोग कर रहा हूं। मेरे कोड है:

var tim; 
$(document).ready(function() { 
    tim = window.setInterval("refresh()", 2000); 
}); 

function refresh() { 
    $.post("procedures.aspx", $("#formID").serializeArray(), function (data) { 
    if (data != ""){ 
     var xml = $.parseXML(data); 

     ... (read and process xml to do changes in the html) 

    } 
    } 
} 
+1

शायद आपको कुछ मेमोरी रिसाव का सामना करना पड़ रहा है। कृपया समस्या को सरलतम कोड में संकुचित करने का प्रयास करें जो इस व्यवहार का कारण बनता है (जेएसफ़िल्ड का स्वागत है)। –

+1

ब्राउज़र ब्लॉक इस तथ्य से आता है कि टाइमआउट/अंतराल कभी-कभी विश्वास नहीं किया जाता है, समर्पित थ्रेड पर काम करता है। हालांकि ऐसा लगता है कि आपके पास स्पष्ट रूप से अंतर्निहित समस्या है, वेब श्रमिकों को देखने में कुछ लाभ हो सकता है, जो आप वर्णन कर सकते हैं, और वास्तव में एक अलग धागे पर चलते हैं। – Utkanos

+0

कृपया सेट इंटरवल कोड –

उत्तर

5

आप निरीक्षण के लिए किसी भी कोड का टुकड़ा पोस्ट नहीं किया है, तो मेरा उत्तर आमतौर पर जब इस तरह के "मतदान" कार्यों बनाने बना एक त्रुटि पर आधारित है। मैं यह भी मान रहा हूं कि आप jQuery या MooTools जैसे ढांचे का उपयोग किए बिना मैन्युअल रूप से चीजें कर रहे हैं।

आपकी समस्या सबसे प्रत्येक मतदान कॉल में नए एक XMLHttpRequest ऑब्जेक्ट बनाने के बजाय setInterval के बाहर ऐसे ही एक उदाहरण बनाने, और खोलने और इस समय और फिर से उपयोग करने की वजह से होने की संभावना है।

मूल रूप से, अगर आप इस तरह अपने कोड लिखने जा सकता है:

var pollInterval = setInterval(function() { 
    var xhr = new XMLHttpRequest(); //ouch, this hurts! 
    xhr.open('GET', 'url', true); 
    xhr.send(); 
    //etc. 
}, 2000); 

यदि यह मामला है, केवल मतदान लूप से बाहर XMLHttpRequestObject निर्माण के लिए कदम सुनिश्चित करें कि आप एक ही वस्तु को बार-बार उपयोग करते हैं, इस प्रकार एक प्रकार की स्मृति रिसाव को रोकना (अगर मैं इसे कह सकता हूं)।

var xhr = new XMLHttpRequest(); //now we can re-use this! 
var pollInterval = setInterval(function() { 
    xhr.open('GET', 'url', true); 
    xhr.send(); 
    //etc. 
}, 2000); 


फिर से, आप किसी भी कोड का टुकड़ा पोस्ट नहीं किया है, या किसी भी चौखटे के विवरण आपके द्वारा उपयोग किए जा सकते हैं। तो मैं जो सुझाव दे रहा हूं वह एक त्रुटि पर आधारित है जिसे मैंने अक्सर अजाक्स कोड का निरीक्षण करते समय सामना किया है। उम्मीद है की यह मदद करेगा। यदि नहीं, तो प्रश्न संपादित करें और कुछ कोड पोस्ट करें।

अस्वीकरण: मैंने ब्रेवटी के लिए केवल XMLHttpRequest ऑब्जेक्ट का उपयोग किया, न कि विक्रेता नफरत (या प्यार)। आप स्पष्ट रूप से एक क्रॉस-ब्राउज़र अनुरोध ऑब्जेक्ट इंस्टेंटेशन फ़ंक्शन का उपयोग करेंगे, या फिर भी एक लाइब्रेरी बेहतर होगा जो इन गॉरी विवरणों को दूर करता है।
 

अपडेट


तो, अपने कोड डोम हर दो सेकंड में अपडेट करनी होगी? जब तक पेज लोड हो जाता है? कभी भी रोकना बंद करो? मैंने सोचा कि मैं कहीं एक स्पष्ट अंतराल देखेंगे, लेकिन वैसे भी।

इसमें कुछ समय अजीब है।मुझे ऐसी स्थिति में सबसे नज़दीक मिला है जब मुझे एक वास्तविक समय (ठीक है, छद्म-रीयलटाइम 1s) ग्राफ के लिए एक टिकर एपीआई के आधार पर एक पल्स लाइन को कोड करने की आवश्यकता होती है। मेरे मामले में अच्छा हिस्सा यह था कि एपीआई तेजी से चमक रहा था, सुपर कम विलंबता के साथ, मुझे प्राप्त डेटा केवल एक फ्लोट था, और इसके साथ किए गए डोम मैनिप्ल्यूशन ने नगण्य स्पेस-टाइम जटिलता की थी।

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

  1. स्वच्छ टिप: window.setInterval("refresh()", 2000) में उद्धरण से छुटकारा। यह सिर्फ होना चाहिए window.setInterval(refresh, 2000) कारण यहां हैं: Memory leak for javascript setInterval

  2. तो, $ .post निश्चित रूप से नई एक्सएचआर हर दो सेकंड वस्तुओं, कोड के अनुसार पैदा करेगा। वास्तव में, सर्वर प्रतिक्रिया समय क्या हैं? सेट इंटरवल लूप कितनी बार करता है? कम गणना के लिए, 10 सेकंड से कम प्रतिक्रिया समय के लिए कहें, नए एक्सएचआर '0 'समस्या नहीं होनी चाहिए।

  3. 500 लाइन एक्सएमएल पार्सिंग? प्रत्येक अंतराल? मुझे दर्दनाक लगता है। क्या यह आपके लिए XML को JS12 स्ट्रिंग में सर्वर पर टोकननाइज़ करना संभव होगा, और इस स्ट्रिंग को UI पर वापस कर दें? यह निश्चित रूप से क्लाइंट सीपीयू चक्र बचाएगा।

11000 लाइनों के साथ एचटीएमएल। तो यह बहुत सारे डोम ट्रैवर्सल और हेरफेर है। यहां एक छोटी चेकलिस्ट है:

  1. क्या आप सर्वश्रेष्ठ चयनकर्ताओं का उपयोग कर रहे हैं? (आपके xpath अभिव्यक्ति की कमी)। Shizzle आप वहाँ कवर किया है, लेकिन आप कर सकते हैं सबसे अच्छा कर सकते हैं। $ ('पी *') जैसी चीजें कहर बरबाद कर सकती हैं।

  2. क्या आपने दस्तावेज़ को कम करने के लिए कम किया है?

  3. लूप्स: के लिए उपयोग करना, या मैप किए गए कार्यों पर सरणियों सबसे अच्छा (सबसे कुशल) कर रहे हैं

  4. संपत्ति का उपयोग: आप बार-बार नेस्टेड संपत्ति उपयोग पर नीचे काटने रहे हैं, और का उपयोग कर दक्षता के लिए एक बंद संदर्भ ?

  5. दक्षता को जोड़ना/कुशल बनाना: उदाहरण के लिए: क्या आप व्यक्तिगत सूची आइटम जोड़ते हैं? आदर्श रूप से आपको एक ही समय में पूरी सूची खंड जोड़ना चाहिए। हटाने के लिए वही आदि। मूल रूप से, बार-बार एक बार बार-बार कुशलता के बजाए हेरफेर।

आपके उपयोग-मामले के निम्न स्तर के इरादे और यांत्रिकी को समझने के बिना, इसे नाखून करना मुश्किल है।

+0

मैंने पहले ही अपना कोड पोस्ट कर लिया है। मैं आपके उत्तर को पूरी तरह समझता हूं लेकिन मुझे नहीं पता कि jQuery व्यवहार जब यह XMLHttpRequest ऑब्जेक्ट बनाता है तो सही है (मुझे लगता है कि यह करता है)। – jbernal

+0

यह मानना ​​उचित है कि $। पोस्ट प्रत्येक बार एक नई एक्सएचआर ऑब्जेक्ट बनाएगा, अन्यथा दो डॉलर के पोस्ट स्टेटमेंट को एक के बाद मानें। प्रत्येक असीमित है, और अलग-अलग समय पर वापस आ सकता है। यदि दो कॉलों ने हुड के नीचे एक ही एक्सएचआर ऑब्जेक्ट का इस्तेमाल किया तो यह विनाशकारी होगा। तो यह शुरुआत करने वालों के लिए है: हर दो सेकंड में एक नया एक्सएचआर। –

+0

आपके त्वरित और पूर्ण उत्तर के लिए बहुत बहुत धन्यवाद, मैं वास्तव में इसकी सराहना करता हूं। मेरे आवेदन को एक बड़ी कंपनी की एक महत्वपूर्ण प्रणाली की निगरानी करनी चाहिए, जहां उपयोगकर्ताओं को वास्तविक समय में कई घटकों और चर की स्थिति जाननी चाहिए। इस कारण से, मेरे एक्सएमएल में बहुत सी रेखाएं हैं, क्योंकि निगरानी करने के लिए बहुत सारे चर हैं। मुझे 11000 लाइनों की एचटीएमएल पसंद नहीं है, लेकिन यह एक आवश्यकता है, सभी जानकारी लोड पेज में होनी चाहिए। जहां तक ​​मुझे पता है, जबकि पृष्ठ लोड किया गया है ताज़ा नहीं हो सकता है और पृष्ठ घंटों तक (यहां तक ​​कि 8 घंटे तक) लोड किया जा सकता है। – jbernal

1

अंत में, मैंने इस मुद्दे को हल किया है। कुल मिलाकर, मुख्य फिक्स जेएसओएन को प्रतिक्रिया सर्वर बदल रहा है। मैंने 4KB तक मेरी प्रतिक्रिया कम कर दी है।

इसके अलावा, मैं डीओएम में एचटीएमएल तत्वों को जोड़ना और जोड़ना अधिक सटीक रहा हूं।

अब, वेबपैप घंटों तक चल रहा है और सब ठीक काम करता है।