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.

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top