EF Core 相关的千倍性能之差: AutoMapper ProjectTo VS Mapster ProjectToType

栏目: ASP.NET · 发布时间: 7年前

内容简介:在前两天遇到 .NET Core 中 EF Core 的异步与同步查询的百倍性能之差(详情之前的博文)之后,这两天又遇到了问题是在昨天发现的,使用如果改为获取10条记录,耗时需要

在前两天遇到 .NET Core 中 EF Core 的异步与同步查询的百倍性能之差(详情之前的博文)之后,这两天又遇到了 AutoMapper ProjectTo<T>Mapster ProjectToType<T> 的千倍性能之差。

问题是在昨天发现的,使用 AutoMapper ProjectTo<T> + EF Core 从数据库中获取20条记录竟然耗时 10s 左右。

[Information] Executed DbCommand ("9,947"ms) [Parameters=["@__p_3='20'"], CommandType='Text', CommandTimeout='30']"

如果改为获取10条记录,耗时需要 5s 左右,从中可以推测某个原因造成获取单条记录增加了额外的开销。

而用同样的 SQL 语句在 SSMS 中查询数据库飞快,可以排除不是数据库层面的问题。

根据前车之鉴,将异步的 ToListAsync() 改为同步的 ToList() ,但问题依旧。

对于这个奇怪的问题,从 EF Core 层面实在找不到线索,于是将怀疑的目光转向了 AutoMapper

代码中用到了 AutoMapper 的 ProjectTo

return await _postQueryRepository
    .GetPostsByStartId(startId)
    .OrderBy(p => p.Id)
    .Take(itemCount)
    .ProjectTo<T>()
    .ToListAsync();

在配置映射时使用了字符串连接:

conf.CreateMap<BlogPost, BlogPostDto>()
    .ForMember(dto => dto.AuthorUrl, opt => opt.MapFrom(p => "https://www.cnblogs.com/" + p.BlogSite.Application + "/"));

去掉上面的映射配置之后,速度立马变得飞快,而 Executed DbCommand 执行时间从 9,947ms 飞流直下 2ms ,原来是 AutoMapper 惹的祸!

[Information] Executed DbCommand ("2"ms) [Parameters=["@__p_3='20'"], CommandType='Text', CommandTimeout='30']"

而同样的代码在 .NET Framework 中没这个问题,看来是 AutoMapperEF Core 相处不融洽。

原因已经找到,那如何解决或避开这个问题呢?这时想到了刚认识不久了解不多的新朋友 —— Mapster ,换上对象映射界的新秀 Mapster 试试。

ProjectTo 改为 ProjectToType ,并如下配置映射关系:

TypeAdapterConfig<BlogPost, BlogPostDto>.ForType()
    .Map(dest => dest.AuthorUrl, src => "https://www.cnblogs.com/" + src.BlogSite.Application + "/");

运行后惊喜地发现 Mapster 没这个问题,多次运行 Executed DbCommand 都在 10ms 以内,千倍之差,让人眼前一亮的新秀。

[Information] Executed DbCommand ("2"ms) [Parameters=["@__p_3='20'"], CommandType='Text', CommandTimeout='30']"

在这冬去春来之际,由于遇到这个问题,也到了我们辞去 AutoMapper 迎来 Mapster 的时候。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据挖掘概念与技术

数据挖掘概念与技术

(加)Jiawei Han;Micheline Kamber / 范明、孟小峰 / 机械工业 / 2007-3 / 55.00元

《数据挖掘概念与技术(原书第2版)》全面地讲述数据挖掘领域的重要知识和技术创新。在第1版内容相当全面的基础上,第2版展示了该领域的最新研究成果,例如挖掘流、时序和序列数据以及挖掘时间空间、多媒体、文本和Web数据。本书可作为数据挖掘和知识发现领域的教师、研究人员和开发人员的一本必读书。 《数据挖掘概念与技术(原书第2版)》第1版曾是受读者欢迎的数据挖掘专著,是一本可读性极佳的教材。第2版充实了数据......一起来看看 《数据挖掘概念与技术》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换