Le 11/10/2018 à 19:03, Jonathan Valliere a écrit : > One explaination I came up was that Java is performing a full upcast when > encountering the generic-based interface. Unchecked and checked genetics > perform identically.
Here is the bytecode for the strictMethod() : 0: aload_0 1: invokevirtual #12 // Method createStrictReceiver:()LSimpleInliningTest$ReceiverB; 4: astore_1 5: aload_0 6: invokevirtual #13 // Method createStrictObject:()LSimpleInliningTest$TypeA; 9: astore_2 10: aconst_null 11: astore_3 12: iconst_0 13: istore 4 15: iload 4 17: ldc #4 // int 1000000 19: if_icmpeq 48 22: aload_3 23: aload_2 24: if_acmpne 36 27: aload_1 28: aload_2 29: invokevirtual #14 // Method SimpleInliningTest$ReceiverB.foo:(LSimpleInliningTest$TypeA;)LSimpleInliningTest$TypeA; 32: astore_3 33: goto 42 36: aload_1 37: aload_2 38: invokevirtual #14 // Method SimpleInliningTest$ReceiverB.foo:(LSimpleInliningTest$TypeA;)LSimpleInliningTest$TypeA; 41: astore_3 42: iinc 4, 1 45: goto 15 48: return and the same for uncheckedMethod(): 0: aload_0 1: invokevirtual #2 // Method createUncheckedReceiver:()LSimpleInliningTest$Receiver; 4: astore_1 5: aload_0 6: invokevirtual #3 // Method createUncheckedObject:()Ljava/lang/Object; 9: astore_2 10: aconst_null 11: astore_3 12: iconst_0 13: istore 4 15: iload 4 17: ldc #4 // int 1000000 19: if_icmpeq 52 22: aload_3 23: aload_2 24: if_acmpne 38 27: aload_1 28: aload_2 29: invokeinterface #5, 2// InterfaceMethod SimpleInliningTest$Receiver.foo:(Ljava/lang/Object;)Ljava/lang/Object; 34: astore_3 35: goto 46 38: aload_1 39: aload_2 40: invokeinterface #5, 2// InterfaceMethod SimpleInliningTest$Receiver.foo:(Ljava/lang/Object;)Ljava/lang/Object; 45: astore_3 46: iinc 4, 1 49: goto 15 52: return My guess is that the difference coms from the invokevirtual being used on one case and invokeinterface in the other (line 29). invokeinterface seems clearly coslier than invokevirtual. -- Emmanuel Lecharny Symas.com directory.apache.org
pEpkey.asc
Description: application/pgp-keys