2012-12-28 15 views
8

में ग्लोबल वेरिएबल मेमोरी उपयोग को संशोधित करना हाल ही में मैं विशेष रूप से मोबाइल ब्राउज़र को लक्षित करने, HTML5 गेम बनाने के लिए जावास्क्रिप्ट कोड के अनुकूलन के साथ थोड़ा सा खेल रहा हूं। मैंने इंजन की तुलना करने और धीरे-धीरे कोडों की तुलना में सरलीकृत करने के साथ शुरुआत की और मुझे कुछ ऐसा मिला जो मुझे समझ में नहीं आया।क्यों क्रोम

मामला मुझे देखा गया है कि क्रोम में (इसलिए मुझे लगता है कि सभी वेबकिट आधारित ब्राउज़र) वैश्विक चरणीय कारणों को संशोधित स्मृति में वृद्धि का कारण बनते हैं।

1) वैश्विक चर संशोधित करना::

कोड:

var globalVariable = 0; 

var fps = 60; 
window.onload = init; 

function init() { 
    setInterval (loop, 1000/fps); 
}; 


function loop(){ 

    for (var i = 0; i < 1000000; i++) { 
    globalVariable = Math.random(); 
    } 
}; 

मेमोरी समय की स्क्रीन: Memory 1

आप इसे देख सकते हैं एक बहुत कुछ है मैं आपको दो उदाहरणों से पता चलता चलो पहले 10 सेकंड के दौरान इकट्ठा करने के लिए स्मृति!

2) के बजाय स्थानीय चर बनाना वैश्विक संशोधित:

कोड एक ही रहता है, केवल परिवर्तन पाश अंदर कीवर्ड "var" जोड़ रहा है। globalVariable = Math.random(); var localVariable = Math.random() बन जाता है; मेमोरी समय की

स्क्रीन: Memory 2

के रूप में आप स्मृति उपयोग वास्तव में कम है देख सकते हैं, पहले 10 सेकंड यह सिर्फ 0.1MB के बारे में बढ़ जाती है के लिए।

अंतर वास्तव में बहुत बड़ा है! मैं अब इसे जांचने में सक्षम नहीं हूं, लेकिन मुझे सूचित किया गया था कि फ़ायरफ़ॉक्स में दोनों उदाहरणों में दोनों मामलों के लिए स्मृति उपयोग लगभग समान दिखता है।

क्या कोई मुझे समझा सकता है, या मुझे उन संसाधनों को इंगित कर सकता है जहां इसे समझाया गया है? या क्या कोई मुझे बता सकता है कि उपयोग की गई मेमोरी को बढ़ाने के लिए ग्लोबल वैरिएबल को कैसे संशोधित किया जाए?

+0

यहां डेमो के लिंक हैं, मैं उन्हें नए उपयोगकर्ताओं के लिए दो लिंक सीमाओं के कारण मूल पोस्ट में पोस्ट करने में सक्षम नहीं था। https://dl.dropbox.com/u/54987642/LocalAndGlobalTest/modifyingGlobalVar.html https://dl.dropbox.com/u/54987642/LocalAndGlobalTest/modifyingLocalVar.html – Jorasso

+0

बहुत दिलचस्प: क्या आपको लगता था अंतर दूसरी तरफ होगा! मेरा सिद्धांत यह है कि ग्लोबल वैरिएबल के लिए लूप के बाहर देखकर अधिक मेमोरी उपयोग होता है क्योंकि इसे उसी दायरे में बनाने के विपरीत होता है। लूप में इसका उपयोग करने से पहले सरणी की लंबाई को कैशिंग करने के समान ही सकारात्मक प्रभाव पड़ता है। – 0x499602D2

+0

यदि क्रोम यह निर्धारित करने में सक्षम था कि आप स्थानीय चर के साथ कुछ भी नहीं करते हैं और कोड को पूरी तरह से छोड़ने में सक्षम हैं, तो ग्लोबल वैरिएबल केस में यह बता देना मुश्किल होगा कि कोई इसका उपयोग कर रहा है या नहीं यह। –

उत्तर

2

लेकिन (प्रथम, 'वैश्विक' चर के बारे में एक त्वरित शेख़ी। वहाँ जावास्क्रिप्ट में कोई वैश्विक चर रहे हैं, वहाँ एक खिड़की-स्तरीय दायरे सहित स्कोप, कर रहे हैं), जवाब है कि एक और से एक चर तक पहुँचने जावास्क्रिप्ट में एक समारोह में स्कोप इसे वर्तमान दायरे में उछालता है। Here's a fun explanation of the effect.

+0

चला रहा हूं तो, चर किसी भी तरह की प्रतिलिपि बनाई गई है, जिसके परिणामस्वरूप स्मृति उपयोग होता है? –

+0

परिवर्तनीय प्रतिलिपि नहीं है - इसमें एक चर का निर्माण किया गया है। – tmcw