2012-10-24 16 views
21

Spędziłem trochę czasu porównując tych trzech twórców map i ciekawe jest, dlaczego tak duże różnice w wydajności między emitmapperem i dowolnym z valueinjecter lub automapper (ostatnie dwa porównywane przez wydajność). Z testów w roztworze emitmapper (1000000 iteracji):Emituj mapper vs valueinjecter lub automapper performance

Auto Mapper (simple):  38483 milliseconds 
    Emit Mapper (simple):  118 milliseconds 
    Handwritten Mapper (simple): 37 milliseconds 

    Auto Mapper (Nested):  53800 milliseconds 
    Emit Mapper (Nested):  130 milliseconds 
    Handwritten Mapper (Nested): 128 milliseconds 

    Auto Mapper (Custom):  49587 milliseconds 
    Emit Mapper (Custom):  231 milliseconds 

Również niektóre punkty odniesienia z valueinjecter prowadzona z dodatkiem emitmapper (do 10000 iteracji):

Convention: 00:00:00.5016074 
    Automapper: 00:00:00.1992945 
    Smart convention: 00:00:00.2132185 
    Emit mapper(each time new mapper): 00:00:00.1168676 
    Emit mapper(one mapper): 00:00:00.0

tam w teście odwzorowujący pierwszy emitują - został stworzony za każdym razem, w drugim - jeden program odwzorowujący dla wszystkich konwersji.

Biorąc to pod uwagę, wynik jest wartością jako wodzik (również jako automapper) wolniejszy niż w 100-krotnym czasie w stosunku do emitera odwzorowującego. Co jest przyczyną tak ogromnej różnicy w wydajności? Jeśli chodzi o mnie, obiekt do obiektu odwzorowującego nie może mieć tyle czasu w porównaniu z odręcznym maperem, ponieważ jest wąskim gardłem projektu (jeśli potrzebujemy na przykład mapować kolekcję obiektów).

W tym momencie myślę o użyciu programu odwzorowującego emisję, ale tylko z jednego powodu, dla którego nie jestem gotowy do podjęcia decyzji: emituję program odwzorowujący nieobsługiwany w ogóle przez pierwszych programistów, ale nie jestem pewien, czy jest to bardzo ważne (bardzo mała możliwość wymagania dodatkowej funkcjonalności).

+4

Bardzo trudno wyciągnąć wnioski z danych, gdy nie wiesz, co zostało przetestowane. Automapper używa refleksji do wykonania początkowego automatycznego mapowania, a następnie buforuje wyniki. Jeśli zmienisz tę część w każdej iteracji, może ona źle działać. Prawdopodobnie uzyskasz lepsze odpowiedzi, jeśli pokażesz, w jaki sposób przeprowadziłeś testy. –

+0

Użyłem dla drugiej części jako kodu bazowego z tej strony: http: //valueinjecter.codeplex.com/wikipage? Title = SmartConventionInjection & referringTitle = Home dla pierwszej części Użyłem projektu porównawczego projektu emitmapper ze strony internetowej emitmapper (http://emitmapper.codeplex.com) – Igor

+0

Dzięki za dostarczenie niektórych testów porównawczych, zdecydowałem się nie używać Automappera. To wszystko spowolniło drastycznie. – Peter

Odpowiedz

11

Powodem jest wyjaśnione int EmitMapper documentation:

Skutecznie wykorzystuje bibliotekę wystawi na generowanie mappers w czasie wykonywania bezpośredniego IL jakby te odwzorowujące są pisane ręcznie. Większość innych twórców map używa biblioteki Reflection do odwzorowania (lub generowania kodu źródłowego). Ponadto EmitMapper minimalizuje operacje box-unboxing i dodatkowe połączenia podczas mapowania. Na przykład wykonuje konwersję typów dla typów wartości bez boksowania i rozpakowywania oraz konwertuje zagnieżdżone elementy bez rekursji (algorytm jednoprzebiegowy), gdy jest to możliwe.

Odbicie jest bardzo powolne w porównaniu do kodu odręcznego. EmitMapper zamiast, w porównaniu z mapowaniem ręcznym, ma tylko narzut podczas uruchamiania, gdy emituje.