11

मेरे पास एक ऐप है जो वेबसॉकेट पर अक्सर बाइनरी संदेश प्राप्त करता है (कम से कम प्रति फ्रेम) और कैनवास/वेबग्ल का उपयोग करके डेटा प्लॉट करता है। मैंने देखा है कि मेरे पास एक बहुत अच्छा देखा-टूथ मेमोरी प्रोफाइल है; डेटा के बहुत कम रहने वाले भाग। enter image description hereवेबसॉकेट अक्सर ऑनमेसेज शून्य-प्रति

यह मैं आश्चर्य नहीं है के बाद से मैं हर 16ms है, जो ड्राइंग के लिए प्रयोग किया जाता है और उसके बाद डी-संदर्भित onmessage से एक वस्तु प्राप्त कर रहा हूँ, कम से कम एक बार।

मेरा प्रश्न है: क्या इससे बचने/कम करने के लिए कोई सुझाव हैं? WebSocket API के आधार पर, प्रत्येक सॉकेट प्राप्त कॉल पर आवंटित नई मेमोरी रखने का विकल्प प्रतीत नहीं होता है। एक और भाषा/पर्यावरण में, मैं कुछ स्मृति को पूर्व-आवंटित करता हूं और उस बफर में प्राप्त करता हूं, ताकि अल्पकालिक वस्तुओं के लिए स्मृति आवंटित करने से बच सकूं, लेकिन ब्राउज़र में जावास्क्रिप्ट में इसे प्राप्त करने के किसी भी स्पष्ट तरीके से मैं नहीं सोच सकता।

संदर्भ के लिए, यहां मेरे फ्रेम्स व्यू हैं।

enter image description here

मैं अगर है कि निष्क्रिय समय कचरा संग्रहण है पता नहीं है? किसी भी देव-उपकरण निंजा अंतर्दृष्टि की सराहना की जाएगी।

+0

आप किसी भी कोड नमूना मिल गया है में जे एस में स्मृति आवंटन बारे में अधिक जानकारी मिल सकती है? कुछ शुरू कर दिया है? एक बेवकूफ? – Anonymous0day

+1

मुझे वेबस्केट्स पर मेरे रास्पबेरी पाई से सेंसर की तारीख स्ट्रीमिंग में एक ही समस्या है। मुझे डर है कि जावास्क्रिप्ट में वेबस्केट्स की स्मृति आवंटन में हस्तक्षेप करने का कोई तरीका नहीं होगा। मेरे शोध ने कोई परिणाम नहीं लाया है। – windm

+0

आप क्या हासिल करने की उम्मीद करते हैं? प्रोग्राम कितना समय चलता है और कितना महत्वपूर्ण है, लंबे समय तक प्रदर्शन किया जाता है? थोड़ा कोड या कोड नमूना देखना बहुत अच्छा होगा –

उत्तर

1

सुनिश्चित नहीं हैं कि अगर मैं आपकी समस्या को समझा है, लेकिन आप किसी अन्य भाषा में की तरह एक वैश्विक सरणी की घोषणा और एक परिपत्र बफर के रूप में इसका इस्तेमाल करते हैं, उदाहरण के लिए कर सकते हैं:

var buffer = []; 
var bufferLength = 1000; 
var start = 0; 
var end = 0; 
var content = 0; 

socket.onmessage(function(msg) { //msg allocated 
    end %= bufferLength; 
    if (end == start && content != 0) 
     console.log("Buffer is full"); 
    else { 
     content++; 
     buffer[end++] = msg; //reference to msg saved so it's not destroyed at the end of the callback 
    } 
}); 

function getNext() { 
    start %= bufferLength; 
    if (start == end && content == 0) 
     console.log("Buffer is empty"); 
    else { 
     content--; 
     return buffer[start++]; // returns reference to next msg 
    } 
} 

संपादित करें: मैं इस सवाल का जवाब संशोधित अधिक होने की मेमोरी चक्र के बारे में स्पष्ट करें:

जेएस वेबसाइकिल पर प्राप्त संदेश के लिए स्मृति आवंटित करेगा और इसे msg नामक संदर्भ देगा जो आपको onmessage के लिए परिभाषित कॉलबैक में एक param के रूप में दिया जाएगा।

नोट जेएस जीसी केवल उस मेमोरी टुकड़े को नष्ट कर देगा जब इसे कोड में संदर्भित नहीं किया जाएगा।

मैं ऊपर जो करता हूं वह उस बफर के अंदर उस संदर्भ को सहेज रहा है ताकि कॉलबैक पूरा होने पर मूल्य नष्ट न हो और आप getNext का उपयोग करके इसे बाद में एक्सेस कर सकें। आपको नई मेमोरी आवंटित करने की आवश्यकता नहीं है क्योंकि जेएस ने आपके लिए यह किया है।

यदि आप msg की एक अलग प्रतिलिपि बनाना या बनाना चाहते हैं, तो कुछ अलग-अलग विकल्प हैं। एक साधारण विकल्प है कि आप क्लोन करने के लिए एक गैर परिपत्र JSON ऑब्जेक्ट होगा अनुमति देगा:

var newJSON = JSON.parse(JSON.stringify(msg)); 

आप https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

+0

यह मेरे प्रश्न का उत्तर नहीं देता है, जो विशेष रूप से संबंधित है "प्रत्येक सॉकेट प्राप्त कॉल पर आवंटित नई मेमोरी"। – sethro

+0

मैं विशेष रूप से 'onmessage'' को पारित ऑब्जेक्ट के लिए आवंटित स्मृति के साथ चिंतित हूं: 'msg'। मुझे लगता है कि आप मेरे प्रश्न को गलत समझ रहे हैं। मैं एक बफर को पूर्व-आवंटित करने का एक तरीका मांग रहा हूं कि वेबसाकेट या शायद कुछ अन्य एपीआई अंतर्निहित सॉकेट से प्राप्त करने के लिए उपयोग करेंगे। – sethro

+1

ठीक है, अब मैं आपकी समस्या को समझता हूं। मुझे नहीं लगता कि आप जेएस का उपयोग कर इसके बारे में कुछ भी कर सकते हैं। आप क्रोम क्रोम: // झंडे/# सक्षम-शून्य-प्रतिलिपि में शून्य-प्रति रास्टरराइज़र को सक्षम करने में कुल देरी में से कुछ को कम करने में सक्षम हो सकते हैं, इसलिए यह वेबग्ल में तेज़ी से प्रस्तुत करता है। साथ ही, आपकी समस्या स्मृति पहुंच के बारे में दी गई है, आप सर्वर से भेजे गए पैकेट के नंबर/आकार के साथ खेल सकते हैं, कम/बड़े पैकेट ऑपरेशन की संख्या को कम कर देंगे। –

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