Riflessione: l'uso del riflesso è ancora "cattivo" o "lento"? Cosa è cambiato con la riflessione dal 2002?

19

Ho notato che quando mi occupo di espressioni o alberi di espressione sto utilizzando molto la reflection per impostare e ottenere valori nelle proprietà e cosa hai. Mi è venuto in mente che l'uso della riflessione sembra essere sempre più comune. Cose come DataAnotations per la convalida, Attribute heavy ORMs, ecc. Mi chiedo: Cosa è cambiato da giorni e anni fa quando mi veniva detto di evitare la riflessione se possibile?

Quindi, se qualcosa è cambiato? È solo la velocità delle macchine? Sono stati apportati cambiamenti al framework per accelerare la riflessione?

O non è cambiato nulla? È ancora "cattivo" o "lento" usare il riflesso?

    
posta blesh 05.04.2012 - 21:12
fonte

3 risposte

16

La riflessione non è né cattiva né lenta. È semplicemente uno strumento. Come tutti gli strumenti, è molto utile per determinati scenari, non così prezioso per gli altri.

Se le prestazioni sono davvero un problema, puoi sempre utilizzare una libreria come FasterFlect .

Ulteriori letture
Se la riflessione è inefficiente, quando è più appropriata?

    
risposta data 05.04.2012 - 21:15
fonte
17

La ragione per cui le persone diffidano nell'usare la riflessione inutilmente non è la performance: sì, c'è un sovraccarico nell'uso della riflessione, ma spesso, risolvendo il problema senza di essa, richiede un approccio diverso con complessità paragonabile, e anche se non lo fosse, il sovraccarico è raramente significativo (specialmente per lo sviluppo a livello di applicazione).

Usando il reflection, alcune importanti assunzioni che si possono fare sul codice sorgente sono interrotte e strumenti come "Find All References" smettono di funzionare in modo affidabile. Reflection rimuove anche la maggior parte del tipo di sicurezza che il compilatore impone, per esempio, C #, e la maggior parte degli errori di programmazione che un sistema di tipi normalmente cattura e traduce in errori del compilatore, ora diventano errori di runtime nei bachi migliori o molto oscuri nel peggiore dei casi.

Quindi perché la gente usa la riflessione allora? In poche parole, perché nonostante i problemi descritti sopra, è uno strumento molto prezioso. Con la riflessione, alcuni dei vantaggi della programmazione dinamica si possono avere in un linguaggio statico e tipizzato come C #, e i linguaggi di programmazione dinamici hanno mostrato i loro meriti di recente, specialmente nel campo della programmazione web - PHP, Javascript e abbastanza prominente Python , tutti usano la digitazione dinamica e si sono dimostrati validi per la programmazione web. Ma dal momento che il linguaggio è ancora C #, puoi scegliere di mantenere la maggior parte della tua applicazione in un linguaggio OOP rigorosamente tipizzato e scrivere la parte piccola in cui il comportamento dinamico fa davvero la differenza con la riflessione.

Un esempio tipico è quando è necessario esporre i metodi come chiamate al servizio web (utilizzando un protocollo non ancora incorporato in .NET). L'approccio OOP rigorosamente tipizzato funziona, ma è eccessivamente restrittivo e maldestro. Ma se usi la reflection per mappare le chiamate ai metodi e le coppie chiave / valore agli argomenti, puoi scrivere l'impianto idraulico per un tale servizio web una volta e poi usarlo su qualsiasi classe che ti piace.

    
risposta data 06.04.2012 - 08:21
fonte
13

La riflessione è ancora molto più lenta delle chiamate dirette. Due cose sono cambiate:

  • I tempi di esecuzione hanno meccanismi di riflessione ottimizzati in modo che la differenza sia diventata più piccola
  • Le CPU sono diventate più veloci così che le piccole inefficienze sono più facili da tollerare

Insieme, questi due fattori hanno portato il costo della riflessione al punto in cui è possibile utilizzarlo regolarmente (se necessario da un POV di manutenibilità) e attendere che il profiler ti dica se è effettivamente un collo di bottiglia (ed essere ragionevolmente sicuro che la maggior parte delle volte non sarà).

    
risposta data 05.04.2012 - 21:24
fonte

Leggi altre domande sui tag