C # Richiamare metodo di classe / interfaccia (codice nativo, costo)
-
01-10-2019 - |
Domanda
Supponiamo di avere un po 'di classe A che implementa alcune interfaccia I
I i = new A();
i.method(); // example 1
A a = (A)i;
a.method() // example 2
Il codice IL generato per ogni chiamata al metodo "()" è lo stesso, ma che una delle invocazioni a metodo "Metodo ()" hanno più costi in codice nativo e perché?
Ogni aiuto sarà apprezzato.
Soluzione
In generale, la chiamata a ((A)a).method()
sarà (sempre leggermente) più veloce, come il compilatore JIT conosce (staticamente) il metodo di cemento che dovrebbe essere chiamato, e quindi può chiamare direttamente A.method
. Chiamando attraverso la I
interfaccia richiede un controllo runtime sul tipo effettivo di oggetto che i punti di riferimento a, e quindi inviano a tale attuazione. Non ho alcun riferimento per questo, però.
So che il compilatore Java JIT ha alcune ottimizzazioni a questo proposito, come tutti chiamata di metodo è virtuale - si indovina e memorizza nella cache l'applicazione più utilizzata di un particolare metodo di interfaccia e ottimizza per questo caso. Il JIT .NET non bisogno di questo quasi quanto, come i metodi devono essere esplicitamente virtuale.
Questa è molto un caso di micro-ottimizzazione che davvero non dovrebbe essere preoccuparsi.
Altri suggerimenti
Se il codice IL è la stessa, così sarà il (costo) del codice nativo. Perché il trattamento JIT in modo diverso?