[沒有蠢問題] AutoMapper 效能很差

最近有一隻程式同事說執行起來很慢 好像是 AutoMapper 的問題

前言

最近有一隻程式同事說執行起來很慢 好像是 AutoMapper 的問題
今天剛好有改到這裡的code所有看了一下 發現到 在做CreateMap時有呼叫一個helper方法
大致上就是string的處理 例如
private string ToLower(string value)
{
    return value.ToLower();
}

原來是 是這支方法沒有防呆 因為當傳入是null的話
就會產生Exception
但是 AutoMapper 不會出錯 不過就是會變非常慢

 

寫個案例 紀錄一下

[Fact]
public void 有Exception時會嚴重影響效能()
{
    // Model
    var config = new MapperConfiguration(cfg =>
    {
        //補上缺少的EventHour EventMinute
        cfg.CreateMap<CalendarEvent, CalendarEventForm>()
            .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.EventDate.Hour))
            .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.EventDate.Minute))
            .ForMember(dest => dest.Title, opt => opt.MapFrom(src => ToLower(src.Title)));
    });

    var calendarEventList = new List<CalendarEvent>();
    for (int i = 0; i < 500; i++)
    {
        calendarEventList.Add(
            new CalendarEvent { EventDate = new DateTime(2008, 12, 15, 20, 30, 0), 
                                Title = "AA" });
    }

    var mapper = config.CreateMapper();
    Stopwatch watch = new Stopwatch();
    watch.Start();
    var act = mapper.Map<List<CalendarEventForm>>(calendarEventList);
    watch.Stop();

    var calendarEventList2 = new List<CalendarEvent>();
    for (int i = 0; i < 500; i++)
    {
        calendarEventList2.Add(
            new CalendarEvent { EventDate = new DateTime(2008, 12, 15, 20, 30, 0), 
                                Title = null });
    }
    Stopwatch watch2 = new Stopwatch();
    watch2.Start();
    var act2 = mapper.Map<List<CalendarEventForm>>(calendarEventList2);
    watch2.Stop();
    //                      9.3秒          > 0.12秒
    Assert.True(watch2.ElapsedMilliseconds > watch.ElapsedMilliseconds);
     
        
}

private string ToLower(string value)
{
    return value.ToLower();
}

結語

改好之後 原本鈍鈍的地方 變超順 讚啦

如果內容有誤請多鞭策謝謝