Mapper kütüphaneleri Performans Testi

Geliştirdiğimiz uygulamalarda kullanıcının ihtiyacı olsada olmasada bir tablonun tüm field’larını içeren nesneyi geri dönüş tipi olarak dönebiliyoruz. ilk zamanlar sayısı az olan kayıtlarda veya istek sayısı az olan projelerde bu durumun sorun olduğu farkedilmeyebilir fakat işin istek yada kayıt boyutu arttığında performans sorununu az-çok yaşamanız olasıdır.

Mapper kütüphaneleri Performans Testi

Mapper kütüphaneleri Performans Testi

Bu makalede 6 farklı yöntemi benchmark’e sokarak hangi mapper yönteminin kaç kayıtta ne kadar sürede tamamlandığını göreceğiz ve sonuçlar karşısında şaşırabilirsiniz 🙂 Şimdi hangi mapper yöntemlerini kullanacağımızı görelim.

Kullanacağımız mapper kütüphaneleri listesi şöyle;

  • TinyMapper
    • Install-Package TinyMapper
  • ExpressMapper
    • Install-Package Expressmapper
  • LightMapper
    • Install-Package LightMapper
  • AutoMapper
    • Install-Package AutoMapper
  • Linq
  • Reflector ile oluşturduğumuz yöntem

Install-Package… ile belirtilmiş kütüphaneleri Manage NuGet Packages yada Package Manager Console‘dan yükleyebilirsiniz.

Linq sistemde yerleşik olarak zaten bulunduğundan indirmeye gerek yok ve Kendi Reflector yöntemimiz ile hazırladığımız kodlara makale devamından ulaşabilirsiniz.

Bu örnekte kullanacağımız Customer ve CustomerDto tanımları şu şekilde olacak.

Üstteki her iki tanım arasındaki koca farkı görüyorsunuz Customer sınıfının veritabanımızdaki Customer tablosuna karşılık gelen sınıf olduğunu düşünelim ve CustomerDto‘da kullanıcılara Müşteri(Customer) bilgileri için gerekli olan ad(Name) soyad(Surname) bilgilerini geri dönderiyoruz.

Makaleyi uzatmamak açısından herhangi bir veritabanı yada tablo v.b oluşturma yada kullanma işlemleri ile uğraşmamak için Faker.NET4 adlı kütüphaneyi kullanarak rastgele veri üreteceğiz.

Faker.NET adlı kütüphaneyi indirmek için Install-Package Faker.Net  komutunu kullanabilirsiniz.

Faker.NET kütüphanesini kullanarak Customer sınıfından 10 tane örnek almayı ve 4 farklı Mapper kütüphanesinin Intialize yöntemlerine ait örnek kodları tanımlayalım şimdi.

Gördüğünüz gibi 4 farklı mapper kütüphanesinin Initialize metodlarına Kaynağın Customer sınıfı ve hedefinde CustomerDto olduğunu tanımladık.

Şimdide bu Mapper kütüphanelerinin asıl amacı olan Dto nesnelerinin nasıl kolayca ve hızlıca oluşturabileceğimizi göreceğiz. Bu mapper kütüphanelerinin haricinde makale başında belirttiğimiz gibi Linq ve Reflector yöntemi ile kendi oluşturduğumuz mapper kod bloğunu nasıl kullanacağımızı göreceğiz.

Mapper’i kullanırken 10 tane rastgele üretilmiş Customer nesnesi üzerinden işlem yapacağımızı söylemiştik şimdi Faker.NET kütüphanesi ile rastgele verilerden üretilmiş bir Customer nesnesini görelim.

CustomerDto nesnesi içerisinde Sadece Name ve Surname adlı 2 property yer alıyor kullanıcının sadece bu alanlara ihtiyaç duyduğunu düşünerek yola çıktık. Hadi şimdide Mapper yöntemi ile CustomerDto nesnelerinin nasıl otomatik oluşturabileceğimizi görelim.

4 Farklı Mapper kütüphanesi, Linq ve Reflector yöntemini kullanarak kendi yazdığımız basit bir metod ile CustomerDto nesnesini Mapper yöntemi ile nasıl oluşturabileceğimizi üstteki örnek kodlarda görmüş olduk ve örnek çıktıya ait görüntü altta yer almaktadır.

Makale başındada şaşıracağınız bir nokta olduğunu söylemiştim oda Bencmarking sonuçlarıdır. 6 Mapper yönteminden hangisinin 1, 10, 100, 1000 Customer nesnesi üzerinden ne kadar sürdüğünü göreceğiz. Bu altı mapper yöntemine ait BenchmarkDotNet kütüphanesinin özellikleri kullanılarak oluşturulmuş MapperBenchmarking sınıfına ait içeriğe gözatalım.

Şimdide BencmarkDotNet kütüphanesi özelliklerini kullanarak oluşturduğumuz MapperBencmarking adlı sınıfın test sonuçlarını alabilmek için alttaki kodu kullanıyoruz.

Hemen makaleyi daha fazla uzatmadan test sonuçlarına gözatalım.

MethodParamMeanStdErrStdDevMedianGen 0Allocated
AutoMapperBenchmark1319.7565 ns1.0437 ns3.9052 ns320.2950 ns0.0310136 B
WithLinqBenchmark1212.1524 ns2.1310 ns13.9738 ns204.2439 ns0.0214108 B
LightMapperBenchmark1601.8155 ns0.8052 ns3.1186 ns601.8548 ns0.0896360 B
MyCustomMapperBenchmark11,653.7048 ns3.3275 ns12.8872 ns1,654.3241 ns0.0036328 B
TinyMapperBenchmark1146.6442 ns0.3886 ns1.5050 ns146.8335 ns0.015768 B
ExpressMapperBencmark1408.4800 ns4.0692 ns25.0845 ns401.2972 ns0.006792 B
AutoMapperBenchmark102,616.9514 ns5.6210 ns21.7702 ns2,622.6707 ns0.0387400 B
WithLinqBenchmark10691.2115 ns1.2524 ns4.6861 ns692.8052 ns0.1054408 B
LightMapperBenchmark105,668.9246 ns11.4476 ns44.3365 ns5,662.0091 ns0.83113.25 kB
MyCustomMapperBenchmark1016,323.7172 ns25.4070 ns88.0124 ns16,320.4379 ns0.23192.93 kB
TinyMapperBenchmark101,144.4695 ns2.4484 ns9.4827 ns1,146.7102 ns0.0552332 B
ExpressMapperBencmark103,680.4923 ns26.6748 ns103.3111 ns3,641.2996 ns572 B
AutoMapperBenchmark10023,562.4691 ns144.8435 ns560.9764 ns23,328.6245 ns2.77 kB
WithLinqBenchmark1004,666.6503 ns44.7121 ns204.8966 ns4,572.4668 ns0.81283.14 kB
LightMapperBenchmark10058,951.8880 ns219.6671 ns850.7671 ns59,024.8561 ns7.535831.9 kB
MyCustomMapperBenchmark100164,057.4851 ns1,314.4040 ns5,090.6648 ns161,583.4743 ns4.231828.7 kB
TinyMapperBenchmark1009,730.2982 ns18.1397 ns70.2549 ns9,732.4868 ns0.51272.7 kB
ExpressMapperBencmark10035,127.0622 ns346.7948 ns1,511.6434 ns34,380.3184 ns0.28485.1 kB
AutoMapperBenchmark1000233,207.6502 ns366.3461 ns1,370.7415 ns233,078.4614 ns24.38 kB
WithLinqBenchmark100040,787.0660 ns163.4213 ns632.9281 ns40,830.9575 ns7.674228.34 kB
LightMapperBenchmark1000565,351.7151 ns3,781.0435 ns14,643.9185 ns561,134.7381 ns81.5430316.32 kB
MyCustomMapperBenchmark10001,711,422.0753 ns11,243.6670 ns43,546.5350 ns1,691,468.5695 ns25.3906284.34 kB
TinyMapperBenchmark1000100,242.1564 ns675.8215 ns2,617.4456 ns100,887.5784 ns2.506524.31 kB
ExpressMapperBencmark1000353,028.2847 ns2,301.8477 ns8,612.7254 ns351,594.5319 ns5.794348.32 kB

4 Farklı renklere ayrılma sebebi 1,10,100 ve 1000 kayıt üzerinde yapılan işlemler sonucunda hangi Mapper türünün ne kadar sürdüğünü ayırtedebilmek için. 4 farklı değerdeki parametre sonucunda mapper türlerinin performans testi sıralamasının bozulmadığını görüyoruz. En performanslı çalışan yöntem Linq Select metodudur. Fakat her dto nesnesi için oluşacak mappingleri kendiniz manuel yapacağınız için bu mapping türünü gözardı edebiliriz bu işi Source, Target eşleşmesi yardımıyla otomatik yapan diğer 4 Mapper kütüphanesine bakacak olursak TinyMapper’in Linq’dan sonra en performanlı Mapper yöntemi olduğu görüyoruz. TinyMapper’i AutoMapper ve Onuda ExpressMapper takip ediyor. Kendi yöntemimiz olan Reflector ile mapper yerlerde sürünüyor 🙂 Ona hiç bakmaya gerek yok.

[fa class=”fa-github”] Bu makaledeki örneklerin tümüne ve diğer tüm C# projelerine buradaki github repository’sinden ulaşabilirsiniz.

Bunlar da hoşunuza gidebilir...

6 Cevaplar

  1. ahmet dedi ki:

    Hocam bilgiler için çok teşekkürler. Benim sitem … için inceleyerek bana tavsiye verir misiniz.

  2. Sertan dedi ki:

    paylaşım için teşekkürler. baya detaylı bir makale olmuş.

  3. Orkun dedi ki:

    hocam hakikaten müthiş bilgiler çok tecrübelisiniz belli yazılarınızı okumaya devam ediyorum

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir