समस्या: मेरे पास एक विधि है जो जावा बाइटकोड के 8000 बाइट से अधिक संकलित है। हॉटस्पॉट में एक जादू सीमा है जो जेआईटी को 8000 बाइट्स से अधिक विधियों के लिए लात नहीं देती है। (हां, यह एक बड़ी विधि है। यह एक टोकननाइज़र लूप है।) विधि लाइब्रेरी में है और मैं पुस्तकालय के उपयोगकर्ताओं को जादू सीमा को निष्क्रिय करने के लिए हॉटस्पॉट को कॉन्फ़िगर करने की आवश्यकता नहीं चाहता हूं।क्या कोई जावा बाइटकोड अनुकूलक है जो बेकार गेटोस को हटा देता है?
निरीक्षण: बाइटकोड को कम करने से पता चलता है कि ग्रहण कंपाइलर बहुत सारे व्यर्थ गेटोस उत्पन्न करता है। (जावैक भी बदतर है।) यही है, गेटोस हैं जो केवल कूद से पहुंचने योग्य हैं। जाहिर है, जो कूदो गेटो पर कूदता है उसे सीधे कूदना चाहिए जहां गोटो कूदता है और गोटो को समाप्त किया जाना चाहिए।
प्रश्न: क्या जावा 5 क्लास फाइलों के लिए बाइटकोड ऑप्टिमाइज़र है जो पॉइंटलेस जंप चेन को फ़्लैट करता है और फिर अनावश्यक गेटोस को हटा देता है?
संपादित करें:
8698: goto 8548
8701: goto 0
जाहिर है, दूसरा गोटो केवल 8701 के लिए एक कूद के रूप में अच्छी तरह से एक दूसरे पर 0.
के लिए एक सीधा कूद हो सकता है जिसके द्वारा पहुंचा जा सकता है: मैं की तरह पैटर्न मतलब जांच, इस संदिग्ध पैटर्न ज्यादा आम है:
4257: if_icmpne 4263
4260: goto 8704
4263: aload_0
कहाँ जाहिर है, एक, संकलक "इसके बराबर नहीं" तुलना करने के लिए "बराबर" तुलना उल्टा करने के लिए चाहते हैं 870 के लिए कूद 4 और गोटो को खत्म करो।
कुछ आर्किटेक्चरों की एक सीमा है कि एक सापेक्ष शाखा कितनी दूर जा सकती है (क्योंकि वे 8 या 16 बिट रजिस्टर में पता रखते हैं) ताकि वे अक्सर एक रिश्तेदार शाखा के साथ एक गैर-रिश्तेदार शाखा के पास हो जाएं जो पूर्ण रूप से उपयोग किया जाता है कार्यक्रम काउंटर आकार। क्या ऐसा JVM है? –
क्या आपका मतलब है * लेबल * केवल कूद से पहुंचने योग्य? –
JVM को संकेत देने के लिए एक रनटाइम एनोटेशन निश्चित रूप से इस मामले में अच्छा लगेगा .... लेकिन मुझे नहीं लगता कि ऐसी चीज मौजूद है (और एक त्वरित Google कुछ भी नहीं बदलता है।) – Jared