बस javap -c [ClassName]
साथ बाइट कोड पर एक नजर है। लूप के साथ एकल-उपयोग चर के कुछ उदाहरण प्रदर्शित करने वाली एक कक्षा यहां दी गई है। प्रासंगिक बाईटकोड डंप टिप्पणी में है:
class HelloWorldLoopsAnnotated {
//
// HelloWorldLoopsAnnotated();
// Code:
// 0: aload_0
// 1: invokespecial #1; //Method java/lang/Object."<init>":()V
// 4: return
////////////////////////////////////////////////////////////////////////////
void stringDeclaredInsideLoop(){
while (true) {
// 0: ldC#2; //String Hello World!
String greeting = "Hello World!";
doNothing(greeting);
}
}
//
// void stringDeclaredInsideLoop();
// Code:
// 0: ldC#2; //String Hello World!
// 2: astore_1
// 3: aload_0
// 4: aload_1
// 5: invokespecial #3; //Method doNothing:(Ljava/lang/String;)V
// 8: goto 0
////////////////////////////////////////////////////////////////////////////
void stringDeclaredOutsideLoop(){
String greeting;
while (true) {
greeting = "Hello World!";
doNothing(greeting);
}
}
//
// void stringDeclaredOutsideLoop();
// Code:
// 0: ldC#2; //String Hello World!
// 2: astore_1
// 3: aload_0
// 4: aload_1
// 5: invokespecial #3; //Method doNothing:(Ljava/lang/String;)V
// 8: goto 0
////////////////////////////////////////////////////////////////////////////
void stringAsDirectArgument(){
while (true) {
doNothing("Hello World!");
}
}
// void stringAsDirectArgument();
// Code:
// 0: aload_0
// 1: ldC#2; //String Hello World!
// 3: invokespecial #3; //Method doNothing:(Ljava/lang/String;)V
// 6: goto 0
////////////////////////////////////////////////////////////////////////////
private void doNothing(String s) {
}
}
stringDeclaredInsideLoop()
और stringDeclaredOutsideLoop()
उपज समान छह अनुदेश बाईटकोड। stringDeclaredInsideLoop()
अभी भी जीतता है: सीमित दायरा सबसे अच्छा है।
कुछ चिंतन के बाद, मैं वास्तव में नहीं देख सकता कि कितना कसौटी प्रदर्शन कभी प्रभावित करेगा: ढेर में समान डेटा को समान निर्देशों की आवश्यकता होगी।
stringAsDirectArgument()
, हालांकि, केवल चार निर्देशों में ऑपरेशन को परिभाषित करता है। कम मेमोरी वातावरण (जैसे मेरा शानदार बेवकूफ फोन) ऑप्टिमाइज़ेशन की सराहना कर सकता है जबकि आपके कोड को पढ़ने वाले सहयोगी नहीं हो सकते हैं, इसलिए अपने कोड से शेविंग बाइट्स से पहले निर्णय लें।
अधिक के लिए full gist देखें।
यह उत्तर भ्रामक है, क्योंकि इसका तात्पर्य है कि प्रत्येक पुनरावृत्ति के बाद संदर्भ-चर आवंटित किया जाता है, जो * सत्य नहीं है। –
@ ब्लूराजा - डैनी Pflughoeft: जैसा कि मैंने अपने जवाब में कहा था, यह केवल एक वस्तु के लिए * संदर्भ * बना रहा है, पूरे ऑब्जेक्ट को आवंटित नहीं कर रहा है। यही कारण है कि स्मृति की मात्रा बहुत छोटी है - क्योंकि केवल संदर्भ के लिए आवश्यक कुछ बाइट्स शामिल हैं। – MAK
हाँ मैं समझता हूं; लेकिन यहां तक कि उस संदर्भ (पॉइंटर स्वयं) को केवल एक बार आवंटित किया जाता है, जो वाक्यांश * * आवंटित/इसे हटाने से आपके कार्यक्रम को महत्वपूर्ण रूप से प्रभावित नहीं करना चाहिए "* का अर्थ है। –