prestazioni di esecuzione in tempo di codice nella classe creata usando riflessione rispetto a una classe di 'normale'

StackOverflow https://stackoverflow.com/questions/1846587

Domanda

E 'il tempo di esecuzione (run-time) prestazioni del codice in una classe che viene caricata attraverso la riflessione identica per lo stesso codice quando la classe viene creata usando la nuova parola chiave?

Io dico di sì. Ma stavo discutendo questo con un collega che ritiene che il codice di riflessione orientata è sempre più lento.

La mia opinione è che, indipendentemente da come la classe è stato originariamente caricata / creato, la performance sarà identico perché il compilatore JIT non interessa come una classe è stata caricata.

Ho ragione? In entrambi i casi, lo apprezzerei tutti i riferimenti che possono aiutare a chiarire questo.

(NB:. Non sto parlando della performance del creazione di una classe utilizzando la riflessione contro la nuova parola chiave che sto facendo riferimento al codice vero e proprio nei metodi della classe dopo che è stato creato .)

È stato utile?

Soluzione

Dipende da come lo si esegue ;-p

Una volta entrato in all'interno i metodi per il tipo di carico, sì: regolare GIT etc applica normalmente (si noti che i controlli di sicurezza possono rendere le cose un piccolo più lento se si tratta di parzialmente attendibile, ma non di molto).

Ma prima è necessario invoke po 'di codice sul oggetto dinamico:

  • Se si riesce a lanciare l'oggetto a un interfaccia o classe base che è noto in modo statico, allora sarà identico.
  • Se questo non è possibile, ma è possibile legare le operazioni specifiche di noti delegati (ad esempio Func<string,int>, via Delegate.CreateDelegate), allora sarà quasi veloce, ma meno comodo.
  • Se si fa tutto via DynamicInvoke(), sarà piuttosto melassa-come.
  • In 4.0, dynamic può offrire una casa a metà strada, in quanto offre anatra tipizzazione con caching ottimizzato in base alla tipologia.

Quindi: come stai accedervi

Altri suggerimenti

Sì, una volta caricata la prestazione è la stessa.

La riduzione delle prestazioni di riflessione è legata alla lettura dei metadati dall'assieme ma il tempo di esecuzione sarà esattamente lo stesso. Cioè, una volta che l'istanza è stata creata e si dispone di un riferimento ad esso, si comporterà come qualsiasi altra classe che avete (compresi JIT compilazione e tutto).

Dipende da come si usa riflessione. E 'sempre più lento, ma si può fare la differenza di tempo molto piccolo se si utilizza IL emettono per creare un metodo di fabbrica in fase di esecuzione. Se si utilizza il semplice Activator.CreateInstance, sarà così molto più lento.

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