Programlama dünyasında nesneler arası aktarım yapılması amacıyla geliştirilmiş olan Automapper kütüphanesi üzerinde yaptığım performans sonuçlarını yazmak istedim.
C# kodu ile geliştirdiğim örnek uygulama üzerinde sırsıyla 10, 100, 1000, 10000 ve 100000 kayıt üzerinde üç farklı şekilde Mapping işlemi yapmayı denedim.
Örnek senaryoda Product adında bir sınıf düşünün. Bu sınıfın 10 farklı property üyesi olsun. Ben bu 10 üyeli Product tipini taşımak istemediğimden ProductSummary adında 2 üyesi olan bir sınıf oluşturuyorum.
public class Product { public int id { get; set; } public string Name { get; set; } public string Color { get; set; } public string Model { get; set; } public string Size { get; set; } ... .. . } public class ProductSummary { public int id { get; set; } public string Name { get; set; } }
Doğal olarak Product nesnesini bir şekilde ProductSummary nesnesine aktarmalıyım. Bu işlemi Automapper kütüphanesi ile ve manuel olarak denediğimde ve süreleri milisaniye cinsinden ölçtüğümde ilginç rakamlarla karşılaştım.
List<Product> products = new List<Product>();
Kayıt sayısı sırayla 10, 100, 1000, 10000 ve 100000 olarak değiştiriliyor ve her seferinde Mapping işlemi deneniyor.
Mapping-1 (Yöntem-1 Foreach döngüsüyle tek tek Mapping işlemi)
foreach (var product in products) { ProductSummary summary = Mapper.Map<Product, ProductSummary>(product); }
10 kayıt için süre 121 milisecond
100 kayıt için süre 127 milisecond
1000 kayıt için süre 155 milisecond
10000 kayıt için süre 498 milisecond
100000 kayıt için süre 5298 milisecond
Mapping-2 (Yöntem-2 Kolleksiyonu direk mapping işlemine sokmak)
IEnumerable<ProductSummary> summary = Mapper.Map<IEnumerable<Product>, IEnumerable<ProductSummary>>(products);
10 kayıt için süre 133 milisecond
100 kayıt için süre 126 milisecond
1000 kayıt için süre 221 milisecond
10000 kayıt için süre 152 milisecond
100000 kayıt için süre 339 milisecond
Mapping-3 (Yöntem-3 Automapper kullanmadan manuel olarak nesneleri oluşturmak)
foreach (var product in products) { ProductSummary summary = new ProductSummary(); summary.id = product.Id; summary.Name = product.Name; }
10 kayıt için süre 1 milisecond
100 kayıt için süre 1 milisecond
1000 kayıt için süre 2 milisecond
10000 kayıt için süre 4 milisecond
100000 kayıt için süre 42 milisecond
Mapping-4 (Yöntem-4 LINQ Extension metodlar yarımıyla mapping işleminin gerçekleştirilmesi)
var data = products.Select(summary=> new ProductSummary{ Id= summary.Id, Name = summary.Name });
10 kayıt için süre 1 milisecond
100 kayıt için süre 1 milisecond
1000 kayıt için süre 1 milisecond
10000 kayıt için süre 1 milisecond
100000 kayıt için süre 1 milisecond
Bu sonuçlara göre Automapper kütüphanesi Mapping işlemlerinde biraz yavaş kaldığı aşikardır. En hızlı yöntemin LINQ Extension metodları yardımıyla Mapping işleminin olduğu ortaya çıkmaktadır. 100.000 kaydın mapping işlemine tabi tutulması 1 milisaniye sürmektedir. Aynı işlem Automapper kütüphanesi ile 5000 milisaniyeden fazla sürmektedir. Yani zaman probleminin olmadığı uygulamalarda Automapper kullanılabilir. Ancak işlemleri uzun sürede bitirmesi amacıyla yazılmış bir uygulama şu ana kadar hiç görmedim.
Bir sonraki yazıda görüşmek dileğiyle.