Nine MVP's Blog

23/09/2013

Object Mapping Library Performance Testing

ตอนนี้ปั่นไวๆ ไม่มีแบบแผนอะไรมาก เนื่องจากมีการ discuss กันในกลุ่ม ASP.NET & MVC Developers Thailand เกี่ยวกับการทำ mapping object
และได้หยิบยกประเด็นเรื่อง
Performance ว่าน่าวิตกแค่ไหนสำหรับการใช้ Library กลุ่มนี้

ผมจึงได้หยิบออกมาทดสอบด้วยกัน 4 วิธีคือ

  1. Custom Mapping
  2. EmitMapper
  3. ValueInjection
  4. AutoMapper

ทุกตัวใช้ version ล่าสุดจาก nuget (prerelease option)

เพื่อหา performance ของ simple object collection จำนวน 1M ล้านตัว เพื่อเปรียบเทียบดู ก็ได้ผลตามนี้

หลักการคือต้องการ .ToList() เพื่อทำการ copy object ไปยังตัวแปรที่รับค่าจริงๆ

เห็นได้ชัดว่าแย่ที่สุดคือ ValueInjection

แย่รองลงมาคือ EmitMapper

ผลเทสดีอันดับที่สองคือ Custom Mapping

และประสิทธิภาพดีที่สุดและทำงานได้ไวสุดยกให้ AutoMapper

มาดู code ที่ใช้ทดสอบ

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using AutoMapper;

using Omu.ValueInjecter;

namespace DemoPartialUpdate

{


public class User

{


public int Id { get; set; }

public string UserName { get; set; }

public string Password { get; set; }

public DateTime LastLogin { get; set; }

}


class Program

{


static void Main(string[] args)

{


int objectLenght = 1000000;


List<User> users = new List<User>(objectLenght);


for (int i = 0; i < objectLenght; i++)

{


User user = new User();

user.Id = i;

user.UserName = “User” + i;

user.Password = “1” + i + “2” + i;

user.LastLogin = DateTime.Now;

users.Add(user);

}


Stopwatch st = new Stopwatch();


//Custom Mapping

st.Start();

var userList = users.Select(o => new User{ Id = o.Id, UserName = o.UserName, Password = o.Password, LastLogin = o.LastLogin}).ToList();

st.Stop();

Console.ForegroundColor = ConsoleColor.Green;

Console.WriteLine(“Custom mapping {0} objects within {1}, objectLenght, st.Elapsed.ToString(“g”));


//EmitMapper

st.Start();

var map = EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<User, User>();

IEnumerable<User> emitUsers = users.Select(o => map.Map(o)).ToList();

st.Stop();

Console.ForegroundColor = ConsoleColor.Blue;

Console.WriteLine(“EmitMapper mapping {0} objects within {1}, objectLenght, st.Elapsed.ToString(“g”));


//ValueInject

st = new Stopwatch();

st.Start();

IEnumerable<User> valueUsers = users.Select(o => (User)new User().InjectFrom(o)).ToList();

st.Stop();

Console.ForegroundColor = ConsoleColor.Red;

Console.WriteLine(“ValueInjecter mapping {0} objects within {1}, objectLenght, st.Elapsed.ToString(“g”));


//AutoMapper

st = new Stopwatch();

st.Start();

var userMap = Mapper.Map<IEnumerable<User>>(users).ToList();

st.Stop();

Console.ForegroundColor = ConsoleColor.Yellow;

Console.WriteLine(“AutoMapper mapping {0} objects within {1}, objectLenght, st.Elapsed.ToString(“g”));


Console.ReadKey();


}

}

}

จบครับ

Advertisements

Create a free website or blog at WordPress.com.