2009-03-05 9 views
18

Eventuali duplicati:
How costly is .NET reflection?La riflessione è davvero così lenta che non dovrei usarla quando ha senso?

La soluzione "elegante" ad un problem che sto avendo è quello di utilizzare gli attributi per associare una classe e le sue proprietà con un altro. Il problema è, per convertirlo in altro, dovrei usare la riflessione. Lo sto prendendo in considerazione per un'app lato server che sarà ospitata sul cloud.

Ho sentito molti rumori di "il riflesso è lento, non lo uso", quanto è lento il rallentamento? È così intensivo per la CPU che moltiplicherà il mio tempo di CPU così tanto che pagherò letteralmente per la mia decisione di usare la riflessione nella parte inferiore della mia architettura sul cloud?

risposta

28

Nel caso in cui non si vede l'aggiornamento sulla domanda iniziale: quando si sta riflettendo per trovare tutti i tipi che supportano un determinato attributo, hai la perfetta opportunità di usare la cache. Ciò significa che non è necessario utilizzare la riflessione più di una volta in fase di esecuzione.

Per rispondere alla domanda generale, la riflessione è più lenta delle chiamate con metodo compilato non elaborato, ma è molto, molto più veloce rispetto all'accesso a un database o al file system e praticamente tutti i server Web eseguono sempre tali operazioni.

+0

Genius (+4 caratteri) –

+2

+1 per il caching del risultato. Se trattate il riflesso proprio come leggere le informazioni dal filesystem, non andrete molto lontano - fatelo, ma non più spesso del necessario. – stevemegson

8

Probabilmente non lo noterete nemmeno. Profilo sempre prima di pensare alle ottimizzazioni.

15

È molto più veloce dell'accesso al file system.

È molte volte più veloce dell'accesso al database attraverso la rete.

È molte molte volte più veloce di inviare una risposta HTTP al browser.

4

Mi sono chiesto la stessa cosa; ma si scopre che la riflessione non è poi così male. Non riesco a trovare le risorse (cercherò di elencarle quando le trovo), ma penso di ricordare che è stato forse da 2x a 3 volte più lento. Il 50% o il 33% del digiuno è ancora veloce.

Inoltre, io sotto la cappa ASP.net webforms e MVC fanno un po 'di riflessione, quindi quanto può essere lento?

EDIT

Qui è una risorsa Ricordo di aver letto: .Net Reflection and Performance

3

Hmm, cerco di evitare la riflessione se posso, ma se devo creare una soluzione, e la riflessione mi dà un modo elegante per risolvere il problema a portata di mano, userò rabbiosamente la riflessione.

Ma, devo dire che penso che la riflessione non debba essere usata per fare "trucchi sporchi". In questo momento sto anche lavorando a una soluzione in cui uso attributi personalizzati per decorare alcune classi, e sì, dovrò usare la riflessione per sapere se una classe/proprietà/qualsiasi cosa è stata decorata dalla mia abitudine attributo.

Penso anche che si tratti di "quanto si fanno chiamate di riflessione"? Se posso, provo a memorizzare i miei risultati nella cache. Come nella soluzione su cui sto lavorando: all'avvio dell'applicazione, controllo alcuni tipi in un determinato assembly, anche se questi tipi sono stati decorati con il mio attributo e, li tengo in un dizionario.

Problemi correlati