Ciao,
On Mon, Jan 7, 2019 at 4:39 PM Federico Fissore [email protected]
[it-torino-java-jug] <[email protected]> wrote:
> Ho un'interfaccia implementata in due modi, uno dei quali è un no-op:
> tutti i metodi sono vuoti
>
> Anche se le classi che usano questa interfaccia possono in teoria
> passare dall'implementazione no-op a quella "vera" a runtime, di solito
> non succede
>
> Hotspot capirà che l'implementation è vuota, non ha side-effect e quindi
> deciderà di eliminare del tutto la chiamata ai metodi?
Perché lo chiedi?
Scommessa con un collega?
Curiosità?
Design?
Short answer: yes.
Long answer:
HotSpot sa che YourInterface ha 2 implementazioni, quindi in JIT
ottimizza i call site in questo modo, da:
yourIntf.method();
in questo (bimorphic call site):
if (yourInterface instanceof NoImpl) {
((NoImpl)yourIntf).method();
} else {
((RealImpl)yourIntf).method();
}
Il JIT continua poi a ottimizzare quanto sopra, facendo l'inline dei
due metodi, quindi il call site diventa:
if (yourInterface instanceof NoImpl) {
// Nothing - inline of NoImpl.method().
} else {
System.out.println("42"); // Inline of RealImpl.method().
}
Con tre o più implementazioni, il call site diventa megamorphic e non
viene ottimizzato, rimane sempre (in pseudo ASM):
virtualTable = lookup(yourIntf.getClass());
address = virtualTable.addressForMethod["method"];
call address
Quanto sopra a grandi linee; quindi con 2 implementazioni paghi sempre
il costo dell'instanceof (1 clock - è solo un'eguaglianza tra
indirizzi), ma non il costo del "jump" al metodo vuoto (né il costo
dei lookup nel caso megamorphic).
Il fatto che il metodo venga inlined dipende da quante volte è
chiamato, e dal budget del compilatore.
Ovviamente dipende dal compilatore usato (C1, C2/Graal) e credo che
dipenda anche da ogni call site: la stessa chiamata a
yourIntf.method() può essere inlined in un call site ma non in un
altro (perché per esempio in un call site è chiamata raramente).
E ovviamente dipende dalla JVM e dalle migliorie che hanno fatto ai vari JITs.
--
Simone Bordet
---
Finally, no matter how good the architecture and design are,
to deliver bug-free software with optimal performance and reliability,
the implementation technique must be flawless. Victoria Livschitz