2013-05-13 10 views
6

Czy istnieje różnica w wydajności między tworzeniem metody emisji IL bezpośrednio, w przeciwieństwie do budowania drzewa wyrażeń?Co jest szybsze: drzewa wyrażeń lub ręczne emitowanie IL

+4

Ponieważ jestem pewien, że już to wypróbowałeś, podziel się swoimi wynikami. –

+1

Naprawdę próbuję się do tego przydać, czy istnieje pewna zasadnicza różnica w sposobie kompilacji drzewek wyrażeń. Na przykład istnieje zasadnicza różnica w sposobie wykonywania metody przez odbicie, w jaki sposób jest wykonywane, powiedzmy, kiedy jest wywoływana z drzewa wyrażeń lub przez wiązanie dynamiczne. Zastanawiam się więc, czy "kompilacja" drzewek ekspresji daje wynik, który jest w pewien sposób znacząco różny od tego, co wygenerował IL generowany ręcznie. – sircodesalot

+2

Spróbuj obu sposobów, wyjdź stoper, wkrótce będziesz wiedzieć, która jest szybsza. To jedyny sposób na poznanie. –

Odpowiedz

6

Ostatecznie API drzewa ekspresji jest po prostu bardziej znanym interfejsem API niż relection.emit, a zatem są one efektywnie równoważne, chociaż uważam, że istnieje wiele rzeczy, których nie można zrobić w drzewach ekspresji, które można uzyskać poprzez bezpośrednie odbicie. emitować.

Reflection.Emit jest najszybszym ogólnym, ale w taki sam sposób, w jaki pętla for jest szybsza niż foreach ogólnie. Istnieje wiele scenariuszy, w których można napisać kod, który działa szybciej przy użyciu pliku reflection.emit niż przy użyciu api wyrażenia, ale w większości przypadków powinny one być równoważne.

Teraz API wyrażeń może być nieco lepszym sposobem robienia rzeczy z kilku powodów.

  1. Składa się w prostszy sposób niż za pomocą bezpośredniego reflection.emit. Możesz pobrać drzewo wyrażenia i ponownie je zapisać, aby dodać trochę logiki w sposób znacznie łatwiejszy niż w przypadku użycia bezpośredniego IL-any. W przyszłości mogą zostać dodane optymalizacje, których możesz nie rozumieć, które nie wystąpiłyby podczas korzystania z odbicia w kierunku. .emitować.

Ostatecznie powiedziałbym, że to pranie. Jeśli jest to naprawdę krytyczne i dobrze znasz reflection.emit, zazwyczaj możesz użyć skrótów w IL, że nie skorzystasz z API ekspresji, ale poza tym, w ogólnym użyciu, powinny one być dość ekwiwalentne.

+1

Doskonały. To jest sedno tego, o co prosiłem, dziękuję. – sircodesalot

+1

Nie ma problemu, powodzenia w podróży do światów reflect.emit i/lub api. –

9

Doskonałe i złożone pytanie. Do niedawna Expression po prostu nie był w stanie obsłużyć wszystkich scenariuszy - więc w wielu przypadkach nie było to pytanie. Zmienia się to wraz z wprowadzeniem Expression.Block itp. W większości "zwykłych" przypadków użycie wyrażenia jest prawdopodobnie więcej niż wystarczające, ale przyznaję, że nie mam dokładnych pomiarów, po prostu dlatego, że podczas gdy robię dużo IL, to również celuj w ramy niższego poziomu, które nie mają luksusów, takich jak Expression (a na pewno nie Expression.Block). Mam również tendencję do stosowania złożonych podejść "dekoratorów", które nadają się ładnie do układania gimnastyki w IL, ale niekoniecznie do ekspresji (w rzeczy samej, jeśli twój IL jest na tyle nietypowy, że reflektor i walka z nim, to prawdopodobnie również nie mapuje czysto do wyrażenia - a moja IL jest raczej gnarly).

Niestety, nie mogę dać ci więcej danych numerycznych - Główne punkty:

  • jeśli wymagania ramowe w dół poziomu kwestia jest dyskusyjna
  • inaczej, trzeba by profil
Powiązane problemy