autoboxing Integer.valueOf
, जो आंतरिक रूप से 127 के लिए छोटे पूर्णांक (डिफ़ॉल्ट -128 द्वारा लिए पूर्णांक वस्तुओं कैश का उपयोग करता है, लेकिन अधिकतम मूल्य "java.lang.Integer.IntegerCache.high" संपत्ति के साथ विन्यस्त किया जा सकता - स्रोत कोड देख Integer.valueOf का), इसलिए यह सीधे new Integer
पर कॉल करने से अलग है। क्योंकि Integer.valueOf
new Integer
पर कॉल करने से पहले पूर्णांक मान की परिमाण के लिए त्वरित जांच करता है, यह new Integer
पर कॉल करने के लिए थोड़ा तेज़ है (हालांकि यदि आपके पास बहुत छोटे पूर्णांक हैं तो यह अधिक स्मृति का उपयोग करता है)। जावा में आवंटन बहुत तेज़ है, और जीसी करने का समय लाइव अल्पकालिक वस्तुओं की संख्या के समान है (यानी कचरे की मात्रा के अनुपात में नहीं), इसलिए जीसी भी बहुत तेज़ है।
लेकिन जेवीएम संस्करण और कौन सा अनुकूलन सक्षम है, के आधार पर स्केलर प्रतिस्थापन अनुकूलन है, जो अल्पकालिक वस्तुओं को आवंटित करते समय बहुत बड़ा प्रदर्शन अंतर उत्पन्न कर सकता है (आपके उदाहरण में ऑप्टिमाइज़ेशन नहीं किया जा सकता है, क्योंकि आप किसी मानचित्र में वस्तुओं को संग्रहीत कर रहे हैं, लेकिन कई अन्य परिस्थितियों में यह उपयोगी है)।
हाल ही में जेवीएम संस्करणों में scalar replacement अनुकूलन है (1.6.0_18 को छोड़कर जहां से बचने का विश्लेषण temporarily disabled है), जिसका अर्थ है कि अल्पकालिक वस्तुओं के आवंटन को अनुकूलित किया जा सकता है। जब JVM में स्केलर प्रतिस्थापन नया था, तो किसी ने a benchmark बनाया जहां आपके समान कोड था। परिणाम यह था कि प्राइमेटिव्स का उपयोग करने वाला कोड सबसे तेज़ था, स्पष्ट new Integer()
कॉल वाले कोड लगभग प्राइमेटिव का उपयोग करने वाले जितना तेज़ थे, और कोड जो ऑटोबॉक्सिंग का उपयोग करता था वह बहुत धीमा था। ऐसा इसलिए था क्योंकि ऑटोबॉक्सिंग Integer.valueOf
का उपयोग करता है और कम से कम वापस स्केलर प्रतिस्थापन अनुकूलन उस विशेष मामले को ध्यान में नहीं लेता था। मुझे नहीं पता कि तब से अनुकूलन में सुधार हुआ है या नहीं।
स्रोत
2010-02-22 00:04:30
दोनों हिस्सों को चारों ओर लपेटने की कोशिश करें और इसे फिर से माइक्रोबेंमार्क करें। – BalusC
क्योंकि आपके प्रदूषित सूक्ष्म-बेंचमार्क के बाहर जो गलत है, इससे कोई फर्क नहीं पड़ता क्योंकि यह अंततः अनुकूलित हो जाएगा लेकिन अंततः वास्तविक दुनिया में जेआईटी। –