See the generated bytecodeTag(s): Varia
Use the javap included in the JDK bin directory. javap is class disassembler, the result is similar to the assembly code but for the JVM.
Consider the following class
class Test1 { public static void main(String args[]) { new Integer(1); new Integer(2); new Integer(3); } }
javap -c Test1 // to redirect the output to a file javap -c Test1 >test1.out
Compiled from "Test1.java" class Test1 extends java.lang.Object{ Test1(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: new #2; //class java/lang/Integer 3: dup 4: iconst_1 5: invokespecial #3; //Method java/lang/Integer." ":(I)V 8: pop 9: new #2; //class java/lang/Integer 12: dup 13: iconst_2 14: invokespecial #3; //Method java/lang/Integer." ":(I)V 17: pop 18: new #2; //class java/lang/Integer 21: dup 22: iconst_3 23: invokespecial #3; //Method java/lang/Integer." ":(I)V 26: pop 27: return }
class Test2 { public static void main(String args[]) { int i = 1; new Integer(i++); new Integer(i++); new Integer(i++); } }
Compiled from "Test2.java" class Test2 extends java.lang.Object{ Test2(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: iconst_1 1: istore_1 2: new #2; //class java/lang/Integer 5: dup 6: iload_1 7: iinc 1, 1 10: invokespecial #3; //Method java/lang/Integer." ":(I)V 13: pop 14: new #2; //class java/lang/Integer 17: dup 18: iload_1 19: iinc 1, 1 22: invokespecial #3; //Method java/lang/Integer." ":(I)V 25: pop 26: new #2; //class java/lang/Integer 29: dup 30: iload_1 31: iinc 1, 1 34: invokespecial #3; //Method java/lang/Integer." ":(I)V 37: pop 38: return }
Now with the following source and the disassembled listing
class Test3 { public static void main(String args[]) { int i = 1; new Integer(i++); new Integer(i); i = i + 1; new Integer(i); } }
Compiled from "Test3.java" class Test3 extends java.lang.Object{ Test3(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: iconst_1 1: istore_1 2: new #2; //class java/lang/Integer 5: dup 6: iload_1 7: iinc 1, 1 10: invokespecial #3; //Method java/lang/Integer." ":(I)V 13: pop 14: new #2; //class java/lang/Integer 17: dup 18: iload_1 19: invokespecial #3; //Method java/lang/Integer." ":(I)V 22: pop 23: iload_1 24: iconst_1 25: iadd 26: istore_1 27: new #2; //class java/lang/Integer 30: dup 31: iload_1 32: invokespecial #3; //Method java/lang/Integer." ":(I)V 35: pop 36: return }
Note this is very low-level optimization, the gain in performance is not very significative, the class is little bit smaller.
Remember Premature optimization is the root of all evil
mail_outline
Send comment, question or suggestion to howto@rgagnon.com
Send comment, question or suggestion to howto@rgagnon.com