.NET 之 ORM 性能评测
.NET 之 ORM 性能评测
Why
- 你应该总能听到某ORM性能比Dapper高
- 你应该有如下疑问:
- 基准测试是否权威
- 基准测试的方式是否合理
- 基准测试的标准是否能够统一
- 统一基准测试标准/规范
如何进行姿势正确的性能测试
相信大家对 Dapper 的性能,以及基准测试的权威性是没有疑问的(否则不会有那么多ORM在做性能测试的时候直接选型Dapper),那么我们就使用 Dapper 性能基准测试 来作为我们的基准测试模板,并加入一些没有纳入基准测试的 ORM 。这样从合理性/可信度就大体有了一个标准和保障。
接下来 fork Dapper GitHub 仓库,并添加了 SmartSql/IBatis.Net/FreeSql/SqlSugar/Chloe
源代码地址:https://github.com/Ahoo-Wang/Dapper,如对测试结果,测试方法有疑问请给我提交issue。
如何自己进行以上基准测试
强烈建议读者按照以下步骤自己运行基准测试。
- Git-Clone https://github.com/Ahoo-Wang/Dapper
- cd Dapper/Dapper.Tests.Performance
- dotnet publish -c release
- 运行 Dapper.Tests.Performance.exe
- 提示输入,请输入 "*" 运行所有基准测试
- 等待测试结果,目录:BenchmarkDotNet.Artifacts 下会有一个日志文件,和 results 文件夹 (测试结果文件存放在此目录)
基准测试结果
重要提示:FreeSql/SqlSugar 官方nuget包为非Release版本,所以测试结果会有影响,仅供参考。
BenchmarkDotNet=v0.11.1, OS=Windows 10.0.17763
Intel Core i7-8750H CPU 2.20GHz (Max: 2.21GHz) (Coffee Lake), 1 CPU, 12 logical and 6 physical cores
[Host] : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.8.3801.0
ShortRun : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.8.3801.0
ORM | Method | Return | Mean | Rank | Gen 0 | Gen 1 | Gen 2 | Allocated |
---|---|---|---|---|---|---|---|---|
Belgrade | ExecuteReader | Post | 78.74 us | 1 | 2.2500 | 0.6250 | - | 10.63 KB |
LINQ to DB | 'First (Compiled)' | Post | 97.61 us | 2 | 0.5000 | - | - | 2.67 KB |
LINQ to DB | Query<T> | Post | 103.05 us | 3 | 1.3750 | 0.1250 | - | 6.91 KB |
Hand Coded | SqlCommand | Post | 107.37 us | 4 | 2.0000 | 1.0000 | 0.5000 | 12.29 KB |
Dapper | QueryFirstOrDefault<dynamic> | dynamic | 110.83 us | 5 | 2.8750 | 0.1250 | - | 13.57 KB |
Dapper | QueryFirstOrDefault<T> | Post | 111.65 us | 5 | 2.2500 | 1.0000 | 0.3750 | 13.53 KB |
Hand Coded | DataTable | dynamic | 114.78 us | 6 | 2.0000 | 0.5000 | - | 12.51 KB |
PetaPoco | 'Fetch<T> (Fast)' | Post | 114.95 us | 6 | 2.2500 | 0.8750 | 0.2500 | 13.71 KB |
Dapper | 'Query<dynamic> (buffered)' | dynamic | 115.54 us | 6 | 2.2500 | 1.0000 | 0.2500 | 13.93 KB |
PetaPoco | Fetch<T> | Post | 119.76 us | 7 | 2.5000 | 1.0000 | 0.2500 | 14.66 KB |
Dapper | 'Query<T> (buffered)' | Post | 122.10 us | 8 | 2.2500 | 0.8750 | 0.3750 | 13.86 KB |
Susanoo | 'Execut<dynamic> (Static)' | dynamic | 122.68 us | 8 | 2.5000 | 0.7500 | 0.2500 | 15.03 KB |
Massive | 'Query (dynamic)' | dynamic | 122.82 us | 8 | 2.3750 | 0.8750 | 0.2500 | 14.25 KB |
ServiceStack | SingleById<T> | Post | 123.93 us | 8 | 3.0000 | 0.7500 | 0.2500 | 17.59 KB |
LINQ to DB | First | Post | 124.53 us | 8 | 1.1250 | 0.1250 | - | 5.53 KB |
SmartSql | QuerySingleSqlParameterCollection | Post | 125.26 us | 8 | 2.5000 | 0.7500 | 0.2500 | 15.48 KB |
SmartSql | QuerySingle | Post | 126.79 us | 9 | 2.5000 | 0.7500 | 0.2500 | 15.59 KB |
LINQ to SQL | 'First (Compiled)' | Post | 127.17 us | 9 | 2.0000 | - | - | 9.87 KB |
SmartSql | GetById | Post | 127.24 us | 9 | 2.7500 | 0.7500 | 0.2500 | 15.89 KB |
SmartSql | QuerySingleStrongRequest | Post | 127.70 us | 9 | 2.5000 | 0.7500 | 0.2500 | 15.51 KB |
SmartSql | QuerySingleFromXml | Post | 128.27 us | 9 | 2.7500 | 0.7500 | 0.2500 | 16.23 KB |
Susanoo | 'Execute<T> (Static)' | Post | 128.92 us | 9 | 2.5000 | 0.7500 | 0.2500 | 15.05 KB |
SmartSql | QuerySingleStrongRequest<dynamic> | dynamic | 129.88 us | 9 | 2.7500 | 1.0000 | 0.5000 | 16.54 KB |
SmartSql | QuerySingleSqlParameterCollection<dynamic> | dynamic | 130.96 us | 9 | 2.5000 | 0.7500 | 0.2500 | 16.51 KB |
Dapper | 'Contrib Get<T>' | Post | 132.10 us | 9 | 2.2500 | 1.0000 | 0.2500 | 14.51 KB |
DevExpress.XPO | FindObject<T> | Post | 137.14 us | 10 | 6.5000 | 0.2500 | - | 29.97 KB |
Susanoo | 'Execute<dynamic> (Cache)' | dynamic | 140.24 us | 11 | 3.2500 | 1.0000 | 0.5000 | 20.48 KB |
Susanoo | 'Execute<T> (Cache)' | Post | 141.23 us | 11 | 3.2500 | 0.7500 | 0.2500 | 20.96 KB |
EF 6 | SqlQuery | Post | 154.68 us | 12 | 4.7500 | 0.7500 | - | 27.96 KB |
DevExpress.XPO | GetObjectByKey<T> | Post | 160.87 us | 13 | 5.2500 | 1.2500 | - | 32.35 KB |
IBatis | QueryForObject | Post | 163.87 us | 14 | 2.7500 | 0.7500 | 0.2500 | 16.59 KB |
Dapper | 'Query<T> (unbuffered)' | Post | 166.28 us | 15 | 2.2500 | 0.7500 | 0.2500 | 13.89 KB |
Dapper | 'Query<dynamic> (unbuffered)' | dynamic | 171.82 us | 16 | 2.2500 | 0.7500 | 0.2500 | 13.93 KB |
DevExpress.XPO | Query<T> | Post | 172.38 us | 16 | 7.5000 | 0.2500 | - | 35.02 KB |
FreeSql | FromSqlFirstDynamic | dynamic | 180.44 us | 17 | 3.2500 | 0.7500 | 0.2500 | 19.38 KB |
EF Core | 'First (Compiled)' | Post | 188.02 us | 18 | 3.5000 | - | - | 16.14 KB |
FreeSql | FromSqlFirst | Post | 196.92 us | 19 | 3.2500 | 0.7500 | 0.2500 | 19.17 KB |
NHibernate | Get<T> | Post | 201.46 us | 20 | 5.7500 | 0.7500 | - | 32.62 KB |
NHibernate | HQL | Post | 207.57 us | 21 | 5.5000 | 0.7500 | - | 35.11 KB |
Chloe | First | Post | 209.26 us | 21 | 5.0000 | 0.7500 | 0.2500 | 29.85 KB |
EF Core | SqlQuery | Post | 234.51 us | 22 | 4.0000 | - | - | 20.64 KB |
EF Core | First | Post | 238.67 us | 23 | 4.2500 | - | - | 20.33 KB |
EF 6 | First | Post | 243.86 us | 24 | 10.5000 | - | - | 48.44 KB |
LINQ to SQL | ExecuteQuery | Post | 250.54 us | 25 | 7.0000 | 1.0000 | 0.5000 | 42.48 KB |
EF Core | 'First (No Tracking)' | Post | 250.59 us | 25 | 3.7500 | 0.7500 | 0.2500 | 21.44 KB |
NHibernate | Criteria | Post | 256.87 us | 26 | 11.0000 | 1.0000 | - | 65.64 KB |
EF 6 | 'First (No Tracking)' | Post | 314.69 us | 27 | 9.0000 | 1.0000 | - | 55.27 KB |
NHibernate | SQL | Post | 336.02 us | 28 | 19.0000 | 1.0000 | - | 101.4 KB |
FreeSql | First | Post | 429.83 us | 29 | 5.0000 | 1.0000 | 0.5000 | 31.56 KB |
SqlSugar | First | Post | 583.49 us | 30 | 10.0000 | 1.0000 | - | 62.5 KB |
LINQ to SQL | First | Post | 761.03 us | 31 | 3.0000 | 1.0000 | - | 14.7 KB |
NHibernate | LINQ | Post | 778.43 us | 32 | 10.0000 | 2.0000 | - | 64.03 KB |
.NET 之 ORM 性能评测的更多相关文章
- 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记
[本文篇幅较长,可以通过目录查看您感兴趣的内容,或者下载格式良好的PDF版本文件查看] 目录 一.ORM的"三国志" 2 1,PDF.NET诞生历程 2 2,Linq2 ...
- C#脚本引擎 CS-Script 之(二)——性能评测
以下以一个简单的HelloWord程序为例,来分析csscript脚本引擎的性能. class HelloWorld { public void SayHello() { Console.WriteL ...
- Android App性能评测分析-流畅度篇
1.前言 在手机App竞争越来越激烈的今天,Android App的各项性能特别是流畅度不如IOS,安卓基于java虚拟机运行,触控响应的延迟和卡顿比IOS系统严重得多.一些下拉上滑.双指缩放快速打字 ...
- TCP协议的性能评测工具 — Tcpdive开源啦
Github地址:https://github.com/fastos/tcpdive 为什么要开发Tcpdive 在过去的几年里,随着移动互联网的飞速发展,整个基础网络已经发生了翻天覆地的变化. 用户 ...
- [转帖]SSD的工作原理、GC和TRIM、写入放大以及性能评测
SSD的工作原理.GC和TRIM.写入放大以及性能评测 https://blog.csdn.net/scaleqiao/article/details/50511279 SSD的物理结构和工作原理 ...
- Unity iOS 项目的一种性能评测方法
[Unity iOS 项目的一种性能评测方法]
- (转)用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记
原文地址:http://www.cnblogs.com/bluedoctor/p/3378683.html [本文篇幅较长,可以通过目录查看您感兴趣的内容,或者下载格式良好的PDF版本文件查看] 目录 ...
- Django之缓存+序列化+信号+ORM性能优化+验证码
缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加 明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcach ...
- 硬核评测:企业上云的极速存储挑战,华为云全新极速IO云硬盘性能评测
来源:至顶网 作者:董培欣 借助华为云全新一代极速IO云硬盘开启邀测的时机,至顶网评测实验室展开了一次华为云极速IO云硬盘与超高IO云硬盘的性能对比测试活动,并且尝试通过相关测试成绩,对云硬盘的应用能 ...
随机推荐
- Java8函数式编程和lambda表达式
文章目录函数式编程JDK8接口新特性函数接口方法引用函数式编程函数式编程更多时候是一种编程的思维方式,是一种方法论.函数式与命令式编程区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉 ...
- feign 负载均衡熔断器
feign:和zuul配合进行负载均衡. 注解的含义: @EnableDiscoveryClient 声明它是一个资源服务端,即可以通过某些接口调用一些资源: @EnableFeignClients ...
- Vue之数据绑定
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 第1节 flume:8、flume采集某个文件内容到hdfs上
2. 采集文件内容到HDFS 需求分析: 采集需求:比如业务系统使用log4j生成的日志,日志内容不断增加,需要把追加到日志文件中的数据实时采集到hdfs. 同一个日志文件的内容不断增 ...
- luogu P1008 三连击
题目背景 本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序. 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2: ...
- ES搭建
https://www.cnblogs.com/jstarseven/p/6803054.html
- CSS3---圆角设置
1.border-radius是向元素添加圆角边框.border-radius:10px; /* 所有角都使用半径为10px的圆角 */ border-radius: 5px 4px 3px ...
- linux 服务器 php vue项目部署流程总结
服务器配置 购买阿里云服务器 (选择ubuntu 16系统 / 内存2G以上) 安全策略, 入规则: 添加端口 20,21,22, 80, 443, 3306, 8080, 安装宝塔 wget -O ...
- 阿里云服务器ecs配置之安装mysql
安装mysql数据库 1.安装工作: 下载 mysql 源安装包 [root@ming ~]# wget http://dev.mysql.com/get/ ...
- 算法导论 第十二章 二叉搜索树(python)
上图: 这是二叉搜索树(也有说是查找树的)基本结构:如果y是x的左子树中的一个结点,那么y.key <= x.key(如a图中的6根结点大于它左子树的每一个结点 6 >= {2,5,5}) ...