1.测试目的
性能测试可以帮助程序员对比2个方法在不同场景的性能,提供一种很好的量化标准,协助我们在开发程序时根据不同场景使用不同的方法,以提升性能。
2.测试方法
采用由.NET Foundation 提供的一款强力的.NET性能基准测试库BenchmarkDotNet (0.13.0) ,测试AutoMapper的对象映射与在线调试工具采用的表达式树实现的对象映射方法进行性能比较。
官网:https://benchmarkdotnet.org/
3.编写测试用例
3.1 创建空的.NET Core 控制台程序
3.2 引入程序包
PM> Install-Package Microsoft.Extensions.DependencyInjection
PM> Install-Package Microsoft.Extensions.DependencyInjection.Abstractions
PM> Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection
PM> Install-Package BenchmarkDotNet
3.3 初始数据
- 创建SimpleDto类,用于模拟从DTO层获取数据转换为ViewModels层SimpleViewModel对象。
- 创建ComplexDto类,用于模拟当前类嵌套子类的数据转换为ViewModels层ComplexViewModel对象。
- 初始化List<SimpleDto>和List<ComplexDto>,测试数组的性能对比。
3.4 测试用例
在测试方法加入[Benchmark],拥有该特性的方法会执行性能基准测试,最后输出检测报告。加入[Benchmark]特性的方法必须是Public公开的。
同一个类可以加入拥有多个[Benchmark]特性的方法,运行时将执行每个[Benchmakr]方法,并做成一份检测报告。在类上可以加入[MemoryDiagnoser]特性,以查看方法使用内存情况。
针对AutoMapper的Map对象转换以及在线调试工具使用的表达式树实现的对象转换的性能对比测试用例如下:
上图只展示了简单类型转换以及数组转换,测试两种情况的性能对比,针对于复杂类型,内嵌类型以及多重内嵌等情况也是一样的。
更多特性使用详见官网。
3.5 测试报告
在Program.cs中使用BenchmarkRunner.Run<T>()执行测试。值得注意的是,需要在Release模式下运行,而非Debug模式。
运行测试结果如下:
从上图可以看出每个用例的平均响应时长以及内存使用情况,方便我们针对不同场景使用较优的方法,AutoMapper对象映射性能相较于其他方案还是有挺大的差距的。
4. 参考文献
C# 高性能对象映射(表达式树实现):https://www.cnblogs.com/castyuan/p/9324088.html
.NET Core中的性能测试工具BenchmarkDotnet:https://www.cnblogs.com/lwqlun/p/9671611.html