.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云硬盘的性能对比测试活动,并且尝试通过相关测试成绩,对云硬盘的应用能 ...
随机推荐
- int (*a)[10]和int *a[10]的区别
有点晚了,放个链接,睡觉. https://stackoverflow.com/questions/13910749/difference-between-ptr10-and-ptr10
- KVM中存储的配置
存储配置和启动顺序 QEMU提供了对多种块存储设备的模拟,包括IDE设备.SCSI设备.软盘.U盘.virtio磁盘等,而且对设备的启动顺序提供了灵活的配置. 1. 存储的基本配置选项 在qemu-k ...
- 如何用纯 CSS 创作一种文字断开的交互特效
效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/LmjNgL 可交互视频教程 此视 ...
- 条款17:以独立语句将newed对象置入智能指针(Store newed objects in smart pointers in standalone statements)
NOTE: 1.以独立语句将newed对象存储于智能指针内.如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏.
- 项目:开发->测试->上线:流程规范
1) 项目分析 2) 项目经理分工协作 程序就具体流程: 1: 按项目名称: 建git, 数据库, 线上测试虚拟机 2: 按项目经理分配的大的模块. 自行划分工作阶段 a: 划分为小的模块 b: 预估 ...
- tornado框架基础09-cookie和session
01 cookie 在上节,我们简单了解了登录过程,但是很明显,每次都需要登录,但是在平常逛网站的只需要登录一次,那么网站是如何记录登录信息的呢? 有没有什么办法可以让浏览器记住登录信息,下次再次打开 ...
- 【BZOJ 1588】[HNOI2002] 营业额统计(Treap)
Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...
- Poj 2337 Catenyms(有向图DFS求欧拉通路)
题意: 给定n个单词, 问是否存在一条欧拉通路(如acm,matal,lack), 如果存在, 输出字典序最小的一条. 分析: 这题可以看作http://www.cnblogs.com/Jadon97 ...
- php 复制文件夹
public function recurse_copy($src,$des) { $dir = opendir($src); @mkdir($des); while(false !== ( $fil ...
- AI学习笔记(01)
[1]在Ai中,每个对象有两个属性:填充颜色和描边颜色. [2]在AI中,非要选中,才操作.而PS中,选中图层即可. [3]AI中,都是路径. [4]选择工具是选中整个路径,而直接选择工具 ...