.NET 之 ORM 性能评测

Why

  1. 你应该总能听到某ORM性能比Dapper高
  2. 你应该有如下疑问:
    1. 基准测试是否权威
    2. 基准测试的方式是否合理
    3. 基准测试的标准是否能够统一
    4. 统一基准测试标准/规范

如何进行姿势正确的性能测试

相信大家对 Dapper 的性能,以及基准测试的权威性是没有疑问的(否则不会有那么多ORM在做性能测试的时候直接选型Dapper),那么我们就使用 Dapper 性能基准测试 来作为我们的基准测试模板,并加入一些没有纳入基准测试的 ORM 。这样从合理性/可信度就大体有了一个标准和保障。

接下来 fork Dapper GitHub 仓库,并添加了 SmartSql/IBatis.Net/FreeSql/SqlSugar/Chloe

源代码地址:https://github.com/Ahoo-Wang/Dapper,如对测试结果,测试方法有疑问请给我提交issue。

如何自己进行以上基准测试

强烈建议读者按照以下步骤自己运行基准测试。

  1. Git-Clone https://github.com/Ahoo-Wang/Dapper
  2. cd Dapper/Dapper.Tests.Performance
  3. dotnet publish -c release
  4. 运行 Dapper.Tests.Performance.exe
  5. 提示输入,请输入 "*" 运行所有基准测试
  6. 等待测试结果,目录:BenchmarkDotNet.Artifacts 下会有一个日志文件,和 results 文件夹 (测试结果文件存放在此目录)

基准测试结果

重要提示:FreeSql/SqlSugar 官方nuget包为非Release版本,所以测试结果会有影响,仅供参考。


  1. BenchmarkDotNet=v0.11.1, OS=Windows 10.0.17763
  2. Intel Core i7-8750H CPU 2.20GHz (Max: 2.21GHz) (Coffee Lake), 1 CPU, 12 logical and 6 physical cores
  3. [Host] : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.8.3801.0
  4. 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 性能评测的更多相关文章

  1. 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记

    [本文篇幅较长,可以通过目录查看您感兴趣的内容,或者下载格式良好的PDF版本文件查看] 目录 一.ORM的"三国志"    2 1,PDF.NET诞生历程    2 2,Linq2 ...

  2. C#脚本引擎 CS-Script 之(二)——性能评测

    以下以一个简单的HelloWord程序为例,来分析csscript脚本引擎的性能. class HelloWorld { public void SayHello() { Console.WriteL ...

  3. Android App性能评测分析-流畅度篇

    1.前言 在手机App竞争越来越激烈的今天,Android App的各项性能特别是流畅度不如IOS,安卓基于java虚拟机运行,触控响应的延迟和卡顿比IOS系统严重得多.一些下拉上滑.双指缩放快速打字 ...

  4. TCP协议的性能评测工具 — Tcpdive开源啦

    Github地址:https://github.com/fastos/tcpdive 为什么要开发Tcpdive 在过去的几年里,随着移动互联网的飞速发展,整个基础网络已经发生了翻天覆地的变化. 用户 ...

  5. [转帖]SSD的工作原理、GC和TRIM、写入放大以及性能评测

    SSD的工作原理.GC和TRIM.写入放大以及性能评测 https://blog.csdn.net/scaleqiao/article/details/50511279   SSD的物理结构和工作原理 ...

  6. Unity iOS 项目的一种性能评测方法

    [Unity iOS 项目的一种性能评测方法]

  7. (转)用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记

    原文地址:http://www.cnblogs.com/bluedoctor/p/3378683.html [本文篇幅较长,可以通过目录查看您感兴趣的内容,或者下载格式良好的PDF版本文件查看] 目录 ...

  8. Django之缓存+序列化+信号+ORM性能优化+验证码

    缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加 明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcach ...

  9. 硬核评测:企业上云的极速存储挑战,华为云全新极速IO云硬盘性能评测

    来源:至顶网 作者:董培欣 借助华为云全新一代极速IO云硬盘开启邀测的时机,至顶网评测实验室展开了一次华为云极速IO云硬盘与超高IO云硬盘的性能对比测试活动,并且尝试通过相关测试成绩,对云硬盘的应用能 ...

随机推荐

  1. zabbix设置多个收件人

    1.建群组   2.添加群组权限   3.添加用户,归属到上面新建的组   4.动作里发送消息给新建的组   5.这样设置后,管理员账号不用设置收件媒介  

  2. Vickers Vane Pump - How To Choose Vane Pump Parameter Specifications?

    1 rated pressure selection. The rated pressure of the vane pump products is 7MPa, 1OMPa, 16MPa, 2lMP ...

  3. postman使用--批量执行测试用例和数据驱动

    批量执行 在我们测试接口的时候,有时候希望执行所有的测试用例,前面讲的都是测试单个的接口,postman提供了我们批量执行接口的功能 点击Runner 然后我们点击run 执行完会统计出我们的结果,失 ...

  4. 一丶webservice执行存储过程

    返回值组合: json返回 StringBuilder sb = new StringBuilder(); sb.Append("{"); sb.Append("\&qu ...

  5. Mac 下用homebrew安装配置MongoDB

    ---恢复内容开始--- 1.首先安装homebrew,已有就跳过 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent. ...

  6. luogu P2865 路障

    https://www.luogu.org/problemnew/show/P2865 看到题解好多dijkstra,作为一名钟爱于spfa的蒟蒻看不下去了. 有些spfa要跑两边,代码量要曾长好多( ...

  7. windows10下Anaconda的安装与tensorflow、opencv的安装与环境配置

    刚开始学习tensorflow和opencv这一块的知识,所以用博客这个平台来把自己这段学习的经历与感想写下来. tensorflow和opencv则用Anaconda来下载和配置环境. 下载Anac ...

  8. python字符串的格式化

    # -*- coding:utf-8 -*- """ @Author:janson @Date:2018/8/1 @File:StrFormat.py "&qu ...

  9. 深入Linux内核架构——进程虚拟内存

    逆向映射(reverse mapping)技术有助于从虚拟内存页跟踪到对应的物理内存页: 缺页处理(page fault handling)允许从块设备按需读取数据填充虚拟地址空间. 一.简介 用户虚 ...

  10. scp免密码拷贝和ssh免密码登录

    版权声明:本文为博主原创文章,未经允许不得转载. 在平常的工作中经常在两个服务器之间传输文件,而且经常从本地远程登录服务器,每次都要输入密码显然很没效率,这时候该怎么办呢? 首先假设服务器A和B,要想 ...