Ognuno ha spiegato come l'ottimizzazione prematura è una cattiva idea (che è): tuttavia spiegherò perché in realtà non fa alcuna differenza (eccetto per i casi in cui si usa la riflessione - ne riparleremo più avanti).
riferimento statico Nel Codice
Il CLR (e quindi MSIL - che è ciò che C# compila a) ha in realtà alcuna nozione o concetto di spazi dei nomi. Un tipo (classe, enum, ecc.) Viene indicato con il suo nome completo (ad esempio System.Runtime.Serialization.ISerializable
) e "punti fermi" sono altrettanto opachi (significativi) come qualsiasi altro carattere nel nome. L'intero concetto di namespace è qualcosa che C# (o qualsiasi altra lingua tu stia usando) ti fornisce. Tuttavia, in termini di MSIL raw, il nome del tipo in realtà non importa.
In MSIL non si fa mai riferimento a qualcosa con il suo nome. Tutto in un assembly (dll o exe) ha un certo tipo di handle. Ad esempio, un tipo ha uno TypeHandle
e tutto ciò che è contenuto in un tipo ha un MemberHandle
: entrambi sono numeri interi a 32 bit. Quindi quando chiami un metodo non scrivi call <MethodName> on <TypeName> in <Assembly>
in MSIL - invece scrivi call <MethodHandle> on <TypeHandle> in <Assembly>
. Pertanto ottenere un tipo con 5000 caratteri nel nome richiede lo stesso tempo di cui uno con 5. I nomi effettivi vengono memorizzati in un posto separato nell'assieme: solo in modo che sia possibile utilizzare il reflection per ottenerli o per i compilatori (in altre parole, i nomi vengono memorizzati solo "per informazione"): si tratta dei metadati.
Penso che ci sia un modo per far sì che ILDASM ti dia il raw MSIL - ma non ne sono sicuro.
accessibili usando la riflessione
Perché si sta facendo un confronto di stringhe tra il nome del tipo che si desidera ed i nomi disponibili nel gruppo che fa la differenza: confronti di stringhe sono un O (n). Tuttavia, questa volta è minuscolo rispetto al costo totale di riflessione ed è completamente trascurabile (farà nanosecondi di una differenza) - non preoccuparti nemmeno di questo.
Sommario
Questo è il motivo per cui l'ottimizzazione prematura è davvero male - si presume che questo era un collo di bottiglia in cui, in realtà, non più veloce o più lento non c'è modo di farlo.
fonte
2012-02-16 17:03:24
Non voglio competere con la risposta di @PlayDeezGames: davvero non lo sarà. Nei linguaggi dinamici può. In SQL Server può colpire fino al 30% di costi. Mai in C#. –