Ja mapuje, ty małpujesz

Ile to już lat minęło od pierwszego projektu w którym używałeś mapper’a? To był AutoMapper, prawda?

Najlepszy przyjaciel programistów, wróg wydajności. I ta rozkminka za każdym razem… czy  ja na pewno mogę mapować (nie muszę małpować). Dosyć dawno już Mariusz polecał ValueInjecter, ale różnica wydajnościowa była nieznaczna i ciężko było znaleźć coś lepszego. Na szczęście od tamtej rozmowy minęło już trochę czasu, a na rynku pojawiło się więcej bibliotek mapujących

Na stronie ExpressMapper’a można sobie porównać wydajność poszczególnych małpek. Zmałpuje i przetworzę wyniki testów w postaci rankingów.

Ranking

Osie X – liczba zmapowanych obiektów
Osie Y – czas mapowania podany w milisekundach
wartość -1 – niewspierany rodzaj mapowania

XXL – Zaawansowane mapowanie – zagnieżdzone kolekcje – afterMap – beforeMap

porownanie-mapperow

1. ExpressMapper
2. MAŁPA*
3. Mapster
4. AutoMapper
5. ValueInjecter

XL – Zaawansowane mapowanie – zagnieżdzone kolekcje

porownanie-mapperow xl

1. ExpressMapper
2. MAŁPA
3. OoMapper
4. Mapster
5. ValueInjecter
6. AutoMapper

L – relacja 1 do wielu

porownanie-mapperow l

  1. ExpressMapper
  2. MAŁPA
  3. OoMapper
  4. Mappster
  5. ValueInjecter
  6. AutoMapper

M – relacja 1 do 1

porownanie-mapperow m

  1. MAŁPA
  2. ExpressMapper
  3. OoMapper
  4. Mapster
  5. ValueInjecter
  6. AutoMapper

S – podstawowe mapowanie

porownanie-mapperow s

  1. MAŁPA
  2. TinyMapper
  3. ExpressMapper
  4. OoMapper
  5. Mapster
  6. ValueInjecter
  7. AutoMapper

XS – proste mapowanie enum’ów

porownanie-mapperow xs

  1. MAŁPA
  2. ExpressMapper
  3. ValueInjecter
  4. AutoMapper

Ok.. nie wiem jak was, ale mnie to trochę zaintrygowało, przebitka imponuje. Zarówno pod względem wydajności jak i możliwości na korzyść ExpressMapper’a. Zobaczymy jak wyjdzie w praniu, w końcu nie ma znaczenia jak głosują, ale kto głosy liczy dla niedowiarków ekipa ExpressMapper’a przygotowała projekt z testami żeby samemu można było sobie potestować.

Zostało tylko podsumować wszystkie testy. Im więcej punktów tym gorzej. Liby które w teście nie dawały rady dostały karne 1000 punktów.

lib\test XXL XL L M S XS suma pkt
MAŁPA 2 2 2 1 1 1 9
ExpressMapper 1 1 1 2 3 2 10
ValueInjecter 5 5 5 5 6 3 29
AutoMapper 4 6 6 6 7 4 33
Mapster 3 4 4 4 5 1000 1020
OoMapper 1000 3 3 3 4 1000 2013
TinyMapper 1000 1000 1000 1000 2 1000 5002

I tak mistrzem małpowania jest MAŁPA!!! #hura #jupi #zaskoczenie

Vice mistrzem jest ExpressMapper przegrywając z MAŁPĄ tylko 1 punktem, a daleko w tyle za czołówką na 3 miejscu mamy ValueInject‚era.

Natomiast 4 miejsce zajmuje AutoMapper – jako relikt przeszłości – na zawsze zostanie w naszych sercach

A pozostałe liby… no cóż, przegrały przez karniaki.

Rys historyczny ExpressMapper’a

Po krótkich poszukiwaniach znalazłem na GitHub’ie inicjalny commit – 22 IV 2015. Pierwsza paczka do NUGET została wgrana 16 V 2015 – wersja 0.9.0

W porównaniu do AutoMapper – po niecałym roku popularność jest prawie zerowa.

Liczby pobrań:
AutoMapper – 3 110 477
ExpressMapper – 4 607

Pozostaje nam jedynie trzymać kciuki za rozwój

MAŁPA* –  to tyle co mapowanie ręczne.

4 przemyślenia nt. „Ja mapuje, ty małpujesz

  1. Proponuję jeszcze przedstawic jakiś mały wycinek kodu z możliwościami i sposobem używania każdego z narzędzi, albo chociaż tych, które najlepiej wyszły/najelpiej znamy. Sam od lat używam Value Injectera. Raz z powodu przewagi nad tak bardzo popularnym i przecenianym Automaperem, dwa za to, że bardzo fajnie się go używa, rejestrujemy swoje customowe mapowania, i posługujemy się extension method albo statycznym helperem, jak nam wygodniej :). Poza tym do niektórych zadań jest o tyle lepszy, że działa na zasadzie konwencji, które w prosty sposób możemy sobie przygotować.

  2. Hej,

    Przykładowe porównania są również na stronie ExpressMapper’a w sekcji benchmarks: http://www.expressmapper.org/#benchmarks
    np. dla XXL jest ładne porównanie mapowań. Składniowo na pierwszy rzut oka jest bardzo podobny do AutoMapper’a.

    Z racji tego, że ValueInjecter jest zaraz za ExpressMapperem – w szkicach już mam zaplanowane bardziej szczegółowe porównanie 🙂

  3. Cześć, bardzo fajne porównanie.

    Przymierzam się do rozstania się z AutoMapperem, po małych wewnętrznych testach wydajności jestem trochę porażony wynikami i szukam alternatywy.

    Rzecz w tym że korzystam w AutoMapperze z paru mechanizmów bez których przesiadka byłaby czasochłonna (a nawet byćmoże bezsensowna)

    Flattening – Domain.User.Profile.DisplayName trafia do Dto.UserProfileDisplayName
    Custom ValueResolver – w dodatku „wypełniany” przez Dependency Injection (korzysta z sesji NHibernate która z kolei jest per-request w kontenerze).
    Walidacja konfiguracji – żeby ostrzegł że coś niezmapowane. Inaczej refactoring robi się niebezpieczny 😉
    Projekcje z IQueryable
    AfterMap

     

    Szukam złotego środka pomiędzy wydajnością a kompatybilnością z AM, przynajmniej w powyższym zakresie.

    Jeśli masz jakieś przemyślenia/doświadczenia/wiedzę w tych tematach byłbym wdzięczny 😉

  4. Cześć,

    Rozpocząłem używanie ExpressMapper’a niedawno (nowy projekt), nie miałem okazji go jeszcze podmieniać w starych projektach, a na chwilę obecną moje mapowania są bardzo proste. Planuje zbadać wymienione przez Ciebie funkcje – już mam szkic 🙂

Możliwość komentowania jest wyłączona.