最近有一隻程式同事說執行起來很慢 好像是 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();
}
結語
改好之後 原本鈍鈍的地方 變超順 讚啦
如果內容有誤請多鞭策謝謝