2015-01-08 18 views
5

Dopo aver visto alcuni progetti open source di più dal team di scambio di stack. Ho notato che alcune volte scrivono semplicemente il codice IL corretto in linea nella funzione C#.Quando iniziare a utilizzare IL su lingue superiori

Un esempio perfetto che è possibile vedere in uno dapper file.

La mia ipotesi è che il compilatore non generi il codice che si ritiene essere il più efficiente ea volte è sufficiente farlo per il compilatore.

La mia curiosità sta nel quando la decisione di iniziare a utilizzare l'emettitore IL su un vecchio C# normale?

So che gli esempi sono per stackexchange ma mi sto prendendo per gli altri sviluppatori che hanno dovuto prendere questa decisione visto che esiste Sigil.

+0

Quando il gioco è veramente, * veramente * cattivo. Spero che tu non ci arrivi mai. – BradleyDotNET

+0

sì, immagino. Mi piacerebbe solo vedere i parametri che portano alla decisione. – dbarnes

+8

Dapper usa IL perché ha bisogno di generare dinamicamente codice per tipi che non conoscerà fino al runtime. Non dovresti usare IL per altre circostanze. –

risposta

9

.NET IL è così semplice rispetto ai veri e propri linguaggi di assemblaggio della CPU (x86, ecc.) Che c'è solo un modo per fare praticamente tutto. Ciò significa che non è possibile ottenere prestazioni migliori con un IL migliore, perché non esiste un IL migliore. (Supponiamo che tu non generi IL in modo non ottimale intenzionalmente, cosa che fa un build di debug.)

Le prestazioni .NET dipendono molto di più dal JIT-ter. Comunque, l'intera idea di un linguaggio di alto livello, JIT-ting, GC-ing, ecc. ha i suoi pedaggi sulle prestazioni, quindi le leggere ottimizzazioni in IL non contano molto.

Quindi perché le persone usano IL? È quando generi codice (come quando compili un XSLT, un'espressione regolare o un proxy dinamico). È molto più veloce da fare in IL che creare un codice C# in un buffer di stringa e compilarlo, e questo è tutto.

Oltre alla possibilità di generare codice al volo, quando IL è un must, non credo che IL abbia altri vantaggi. C# è una lingua così ricca e in rapida evoluzione, sarebbe semplicemente pazzesco non usarla. Dover lavorare in IL sarebbe una punizione. Puoi essere certo che C# può essere compilato come IL il più buono possibile.

Puoi anche sentirti libero di utilizzare tutti i tipi di funzionalità C# più recenti. Sono d'accordo, cose come la dinamica potrebbero non avere le migliori prestazioni, ma non si tratta di prestazioni, ma di funzionalità moderne che ti aiutano solo a fare le cose. IL non ti dà questo. (Naturalmente alcune nuove funzionalità aiutano realmente le prestazioni, come asincrone, ma in modi molto diversi rispetto alle ottimizzazioni a livello di assembly, ad un livello molto più elevato.)

E a proposito, AFAIK non è possibile incorporare IL in un C# file. Oltre a generare un nuovo codice al volo, non è possibile compilare IL nel proprio assieme, almeno non in Visual Studio, tranne che con alcuni trucchi che implicano la modifica degli assembly dopo che sono stati creati da C#.

+0

Immagino che scrivendo direttamente IL volevo dire che uso http://msdn.microsoft.com/en-us/library/system.reflection.emit.ilgenerator%28v=vs.110%29.aspx per emettere i codici operativi IL. – dbarnes

+0

Ed ecco un [metodo molto più semplice] (http://msdn.microsoft.com/en-us/library/bb356928.aspx) per generare codice al volo. –

+0

Sì, gli alberi di espressione sono molto utili per le ricerche LINQ, come la compilazione di predicati dinamici. Ma per i miei esempi, specialmente per i proxy dinamici, quando si devono compilare intere classi e assiemi e implementare interfacce ecc., IL è l'unica opzione. – fejesjoco

Problemi correlati