Cosa è più veloce: alberi di espressione o IL che emettono manualmente

c# expression-trees reflection reflection.emit

Domanda

Esiste una differenza di prestazioni tra la creazione di un metodo che emette direttamente IL, invece della costruzione di un albero di espressioni?

Risposta accettata

In definitiva, l'API dell'albero dell'espressione è in realtà solo un'API più familiare su relection.emit e quindi sono effettivamente equivalenti, anche se credo che ci siano molte cose che non è possibile fare negli alberi di espressione che è possibile tramite direct reflection.emit.

Reflection.Emit è il più veloce in assoluto, ma nello stesso modo in cui un ciclo for è più veloce di foreach in generale . Esistono molti scenari in cui è possibile scrivere codice che viene eseguito più velocemente utilizzando reflection.emit di quanto non si possa utilizzare con l'espressione api, ma nella maggior parte dei casi dovrebbero risultare equivalenti.

Ora, l'espressione API si presta ad essere un modo leggermente migliore di fare le cose per un paio di motivi.

  1. È componibile in un modo più semplice rispetto all'utilizzo di reflection.emit diretto. Puoi prendere un albero di espressioni e riscriverlo per aggiungere in una logica molto più facile di te che con l'IL diretto
  2. In futuro potrebbero essere aggiunte ottimizzazioni che potresti non capire che non si sarebbero verificate quando si utilizza direction reflection.emit.

Quindi alla fine, direi che è un lavaggio. Se è davvero fondamentale e si conosce reflection.emit abbastanza bene, di solito si possono prendere alcune scorciatoie in IL che non si otterranno usando l'espressione API, ma a parte questo, nell'uso generale, dovrebbero essere abbastanza equivalenti.


Risposta esperta

Domanda eccellente e complessa Precedentemente, Expression non era in grado di gestire tutti gli scenari, quindi in molti casi era una non-domanda. Questo cambia con l'introduzione di Expression.Block ecc. Nella maggior parte dei casi "comuni", l'uso di Expression è probabilmente più che sufficiente, ma confesso di non avere misurazioni precise, semplicemente per il motivo che mentre faccio un sacco di IL, I si rivolgono anche a framework di basso livello che non hanno lussi come Expression (e certamente non Expression.Block). Tendo anche a usare approcci complessi "decoratori" che si prestano bene per impilare la ginnastica in IL, ma non necessariamente in Expression (anzi, se il tuo IL è abbastanza atipico che Reflector e altri lottano con esso, allora probabilmente non mappa anche pulito a Expression - e il mio IL tende ad essere piuttosto nodoso).

Spiacenti, non posso darti più dati numerici - Punti chiave:

  • se hai i requisiti del framework di livello inferiore, la domanda è discutibile
  • altrimenti, dovresti profilare


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché