我刚刚使用新的 C# 6 null 条件运算符做了一些基准测试 ?.
考虑以下场景:类A
有一个子类B
,它有一个子类,我们希望将C
其Name
属性展平为 DTO。我测试了两种变体:
// using mapfrom
CreateMap<MapFromA, MapFromADto>()
.ForMember(dto => dto.Name, o => o.MapFrom(a => a.B.C.Name));
// using resolveusing with elvis
CreateMap<ResolveUsingX, ResolveUsingXDto>()
.ForMember(dto => dto.Name, o => o.ResolveUsing(x => x.Y?.Z?.Name));
我打电话给_mapper.Map<ResolveUsingXDto>(x);
or _mapper.Map<MapFromADto>(a);
1000 个不同的电话ResolveUsingX x
,MapFromA a
并花时间使用System.Diagnostics.StopWatch
. 这是我的结果:
Distinct elements per batch: 1000; # batches for average: 25
A->B->C.Name, C is never null.
MapForm - average time taken for 1000x: 5527,84 ticks = 1,44 ms.
ResolveUsing - average time taken for 1000x: 5479,76 ticks = 1,4 ms.
A->B->C.Name, C is null 1/3 of the time.
MapForm - average time taken for 1000x: 72924,4 ticks = 27,44 ms.
ResolveUsing - average time taken for 1000x: 5351,2 ticks = 1,48 ms.
A->B->C.Name, C is null 1/2 of the time.
MapForm - average time taken for 1000x: 107016,92 ticks = 40,52 ms.
ResolveUsing - average time taken for 1000x: 5835,32 ticks = 1,56 ms.
A->B->C.Name, C is null 2/3 of the time.
MapForm - average time taken for 1000x: 141437,96 ticks = 53,64 ms.
ResolveUsing - average time taken for 1000x: 5789,72 ticks = 1,56 ms.
MapFrom
必须捕获 NullReferenceExceptions,这比ResolveUsing
使用 elvis 运算符要慢?.