हम एक उच्च स्तरीय संकलित भाषा के लिए बाइट-कोड लिख रहे हैं, और कुछ प्रोफाइलिंग और ऑप्टिमाइज़ेशन के बाद, यह स्पष्ट हो गया कि वर्तमान सबसे बड़ा प्रदर्शन ओवरहेड स्विच स्टेटमेंट है जिसका हम उपयोग कर रहे हैं बाइट कोड मामलों पर कूदने के लिए।लेबल का पता (एमएसवीसी)
हमने प्रत्येक केस लेबल के पते को खींचने और निर्देश कोड की बजाय इसे बाइट-कोड की स्ट्रीम में संग्रहीत करने की जांच की है जिसे हम आमतौर पर स्विच करते हैं। अगर हम ऐसा करते हैं, तो हम कूद तालिका छोड़ सकते हैं, और वर्तमान में निष्पादित निर्देश के कोड के स्थान पर सीधे कूद सकते हैं। यह जीसीसी में शानदार रूप से काम करता है, हालांकि, एमएसवीसी इस तरह की सुविधा का समर्थन नहीं कर रहा है।
हमने लेबल के पते को पकड़ने के लिए इनलाइन असेंबली का उपयोग करने का प्रयास किया (और उन पर कूदने के लिए), और यह काम करता है, हालांकि, इनलाइन असेंबली का उपयोग करके पूरे कार्य को एमएसवीसी अनुकूलक से बचा जा सकता है।
क्या अनुकूलक को कोड पर अभी भी चलाने की अनुमति देने का कोई तरीका है? दुर्भाग्यवश, हम इनलाइन असेंबली में किसी अन्य फ़ंक्शन के लिए किसी लेबल को संदर्भित करने का कोई तरीका नहीं है, क्योंकि लेबल में किए गए किसी अन्य फ़ंक्शन में इनलाइन असेंबली को निकाला नहीं जा सकता है। कोई विचार या विचार? आपका इनपुट बहुत सराहना की है, धन्यवाद!
क्या आपने फ़ंक्शन पॉइंटर्स का प्रयास किया है? –
बाइटकोड में लेबल के पते के बजाय फ़ंक्शंस के पते डालने के बारे में कैसे? फिर आपके पास प्रत्येक निर्देश आईडी के लिए एक फ़ंक्शन है। जब तक आपका fetch-execute लूप आपके बड़े फ़ंक्शन-लेबल-लेबल में न हो। –
यदि मैंने प्रत्येक मामले के लिए फ़ंक्शंस का उपयोग किया है और लेबल पते के बजाय फ़ंक्शन पॉइंटर्स का उपयोग किया है, तो यह काम करेगा।हालांकि, मुझे लगता है कि फंक्शन कॉल ओवरहेड इतना अच्छा होगा कि यह किसी भी प्रदर्शन लाभ को समाप्त कर देगा, भले ही समारोह छोटा था (कोई तर्क नहीं, कोई वापसी नहीं)। हालांकि मैं इसे कोशिश करूँगा, और पोस्ट करने के लिए धन्यवाद। – Trevor