5

जावास्क्रिप्ट लाइब्रेरी (रिवेट्स) में प्रदर्शन समस्याओं की तलाश करते समय, मैंने पाया कि कचरा संग्रह रन में तीन से चार गुना होता है, निष्पादन समय का ~ 15% (क्रोम देवटूल जेएस प्रोफाइल का उपयोग करके) लेता है।जावास्क्रिप्ट में कचरा संग्रहण ट्रिगर कर रहे स्मृति आवंटन का पता कैसे लगाएं?

कम से कम 30 स्थान हैं जहां कचरा संग्रह के कारण संभावित उम्मीदवारों के रूप में अस्थायी कार्य/वस्तुएं बनाई जाती हैं।

मैं जानना चाहता हूं कि मेमोरी को एकत्रित करने के लिए स्मृति के आवंटन के लिए कौन से फ़ंक्शन ज़िम्मेदार हैं, इसलिए मैं अपने प्रदर्शन ट्यूनिंग पर ध्यान केंद्रित कर सकता हूं।

मैं ढेर आवंटन इस समय दर्ज की गई, लेकिन यह याद है कि कचरा एकत्र किया गया था भेदभाव नहीं करता और है कि अभी भी एक संदर्भ रखती

भी दर्ज की गई ढेर आवंटन भाग्य के बिना प्रोफाइल (कोई ग्रे पट्टी DevTools doc में बताया के रूप में है)।

उत्तर

1

DevTools पर Profiles टैब पर Record Heap Allocation का चयन करें। को पर कॉल के भीतर setTimeout पर फ़ंक्शन से पहले Start पर क्लिक करने के लिए पर्याप्त समय पर सेट अवधि के साथ मूल्यांकन किया जाना चाहिए; उदाहरण

<!DOCTYPE html> 
<html> 
<head> 
    <script> 
    t = 5; 
    setTimeout(function() { 
     (function test1() { 
     var a = 123; 
     function abc() { 
      return a 
     } 
     abc(); 
     }()); 
    }, 10000) 
    </script> 
</head> 
<body></body> 
</html> 

जब setTimeout एक नीली पट्टी, संभवतः एक ग्रे पट्टी के बाद कहा जाता है समय पर दिखाई देनी चाहिए के लिए। रिकॉर्डिंग ढेर प्रोफाइल को रोकने के लिए Ctr+E पर क्लिक करें।

टाइमलाइन ग्राफ पर नीली या ग्रे बार का चयन करें। ड्रॉपडाउन मेनू पर Containment का चयन करें जहां डिफ़ॉल्ट विकल्प Summary है।

[1] :: (GC roots) @n 

जहां n एक संख्या है।

[1] :: (GC roots) के बाईं ओर त्रिकोण पर क्लिक करके चयन का विस्तार करें। [1] :: (GC roots) का एक तत्व चुनें, चयनित Distance, Shallow Size, और Retained Size चयन के लिए कॉलम की समीक्षा करें।

विशिष्ट कार्यों की जांच करने के लिए, जहां वैश्विक चर और समारोह कॉल सूचीबद्ध किया जाना चाहिए करने के लिए

[2] :: (External strings) @n 

के लिए स्क्रॉल; i.e.g. "t" और "setTimeout"javascrip से ऊपर। चयन के लिए संबंधित Distance, Shallow Size, और Retained Size कॉलम देखें।

+0

बहुत धन्यवाद। आपके निर्देशों के बाद, मैं विशिष्ट कार्यों की पहचान करने में कामयाब रहा। लेकिन मान उथले और बनाए रखा दिखाता है कि कार्य का आकार स्वयं रनटाइम पर आवंटित स्मृति नहीं है। उदाहरण के लिए: फ़ंक्शन बिल्ड बाइंडिंग (कक्षा की एक विधि) में 144 का उथला आकार और 144 के आकार को बनाए रखा गया है, जो अन्य कार्यों के समान है। लेकिन यह फ़ंक्शन 'var context = pipes.shift() में विभाजित कुछ अस्थायी वस्तुओं को आवंटित करता है। विभाजन ("<")। नक्शा (trimStr); ' मुझे अभी भी नहीं मिला, उदाहरण के लिए, अगर मैं इन अस्थायी वस्तुओं से बचने के लिए कार्यान्वयन को बदलता हूं तो मैं स्मृति में कितना बचत करूंगा। – blikblum

+0

@blikblum 'var context = pipes.shift()। विभाजन (" <")। नक्शा (trimStr); 'आउटपुट तालिका में एक व्यक्तिगत रेखा पर सूचीबद्ध है? – guest271314

+0

नहीं। यह बिल्डबाइंडिंग बॉडी का हिस्सा है। यहां वास्तविक कोड है: https://github.com/blikblum/rivets/blob/svelte/dist/rivets.js#L337 – blikblum

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