.NET热门ORM真实的性能测试总结
2026/7/8 13:34:30 网站建设 项目流程

上次对收集到的ORM作了详细的测试,并整理成了测试项目,下面针对测试结果,详细剖析

测试环境

项目说明
测试框架BenchmarkDotNet
测试数据库SQLite(单机性能优,波动较小)
.NET 版本.NET 6.0+
测试硬件Intel Core i5-8265U CPU 1.60GHz

为什么使用 BenchmarkDotNet?

  1. 专业级微基准测试​:BenchmarkDotNet 是 .NET 生态中最成熟的基准测试框架,能有效规避 JIT 预热、GC 干扰等常见陷阱,确保测试结果的准确性和可重复性。
  2. 统计严谨​:自动执行多次迭代,输出均值、标准差、置信区间等统计指标,避免偶发波动对结论的误导。
  3. 结果易读​:自动生成 Markdown/HTML/CSV 等多种格式的报告,便于横向对比和归档分析。
  4. 低侵入性​:通过 Attribute 标记即可完成测试定义,无需修改业务代码,保持测试的纯净性。

为什么使用 SQLite?

  1. 消除网络与并发干扰​:作为嵌入式单机数据库,SQLite 不存在网络 I/O、连接池争用或服务端负载波动,能更纯粹地反映 ​ORM 或数据访问层本身的性能差异​。
  2. 环境一致性强​:所有测试在同一进程内完成,数据库文件可内存化(:memory:),避免磁盘 I/O 成为瓶颈,测试结果波动极小,适合做精细化对比。
  3. 轻量快速​:无需安装、配置或启动外部服务,测试启动速度极快,便于 CI/CD 流水线中频繁执行。
  4. SQL 兼容性好​:支持标准 SQL 和事务,能覆盖大部分 CRUD 场景,虽非生产级数据库,但作为“性能标尺”已足够客观。

和之前网上写的测试相比(使用大型数据库,使用时间相减,不预热,不多次采样),本次更准确,更客观,更能反映真实的效率问题

测试的ORM

下面列出常见的ORM,特别是国产

<PackageReference Include="Chloe.SQLite" Version="5.55.0" />(半活跃) <PackageReference Include="Dapper" Version="2.1.66" /> <PackageReference Include="FreeSql.Provider.Sqlite" Version="3.5.305" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.0-preview.6.23329.4" /> <PackageReference Include="SqlSugarCore" Version="5.1.4.212-preview02" /> <PackageReference Include="linq2db" Version="6.2.0" /> <Reference Include="Fast.Framework">(停止维护) <Reference Include="myTest">(私有项目)

测试结果关注点

除了运行耗时,内存分配也是非常重要的方面,谁也不想系统内存暴炸吧
下面是具体的测试结果,增加了耗时和内存排名

TestCondition

对表达式进行解析测试,执行一次

query.Where(b => b.F_String == "111" && b.F_Decimal > 0 && b.F_Bool == true && b.F_String.StartsWith("abc")).Select(b => new { b.F_Float, b.F_Bool, b.F_Double, b.F_Byte, b.F_String, b.F_Decimal, b.F_Int64 }).ToSqlString();
MethodProvideTypeMeanErrorStdDevRankGen0Allocated
TestConditionChloeTest87.30 us1.745 us4.865 us25.127016.27 KB
TestConditionEfSqlliteTest227.82 us5.201 us14.922 us319.531361.19 KB
TestConditionFastFrameworkTest92.47 us1.783 us2.723 us26.713920.71 KB
TestConditionFreeSqlTest405.34 us5.108 us4.778 us412.695340.84 KB
TestConditionLinqToDbTest92.26 us0.563 us0.499 us25.859418.29 KB
TestConditionMyTest43.16 us0.689 us0.575 us14.699714.41 KB
TestConditionSqlSugarTest390.76 us8.115 us23.800 us433.6914103.94 KB

TestResult

一次查询100条数据,主要消耗在对象映射上

query.Take(100).ToList();
MethodProvideTypeMeanErrorStdDevRankGen0Allocated
TestResultChloeTest583.0 us10.02 us9.84 us222.460970.68 KB
TestResultDapperTest530.3 us9.75 us12.33 us116.601652.68 KB
TestResultEfSqlliteTest1,129.8 us8.19 us7.26 us464.4531202.9 KB
TestResultFastFrameworkTest11,685.6 us114.75 us95.82 us746.8750153.21 KB
TestResultFreeSqlTest719.6 us15.48 us45.40 us323.437574.36 KB
TestResultLinqToDbTest1,267.2 us24.38 us21.61 us517.578154.6 KB
TestResultMyTest563.9 us3.62 us3.39 us210.742235.42 KB
TestResultSqlSugarTest1,481.1 us29.39 us65.12 us646.8750147.58 KB

TestAnonymousResult

一次查询100条数据,映射为匿名对象

query.Take(100).Select(b => new { b.Id, b.F_Float, b.F_Bool, b.F_DateTime, b.F_Decimal, b.F_Double, b.F_Int64 }).ToList();
MethodProvideTypeMeanErrorStdDevMedianRankGen0Allocated
TestAnonymousResultChloeTest526.8 us7.11 us5.55 us527.4 us220.507865.47 KB
TestAnonymousResultDapperTest510.1 us7.21 us6.02 us508.3 us217.578155.8 KB
TestAnonymousResultEfSqlliteTest652.3 us8.81 us7.35 us653.3 us333.2031102.21 KB
TestAnonymousResultFastFrameworkTest8,186.3 us199.25 us584.38 us7,999.0 us631.2500122.24 KB
TestAnonymousResultFreeSqlTest1,252.1 us11.99 us10.63 us1,251.6 us566.4063203.89 KB
TestAnonymousResultLinqToDbTest1,203.3 us8.91 us8.75 us1,202.3 us415.625052.67 KB
TestAnonymousResultMyTest463.2 us9.25 us21.81 us455.0 us110.742233.73 KB
TestAnonymousResultSqlSugarTest9,063.9 us181.09 us522.50 us8,839.5 us71046.87503210.79 KB

TestQueryLoop

循环20次,查询一条记录

for (var i = 0; i < 20; i++) { var item = query.Where(b => b.Id == i).ToList(); }
MethodProvideTypeMeanErrorStdDevRankGen0Gen1Allocated
TestQueryLoopChloeTest2.816 ms0.0557 ms0.0494 ms374.2188-231.78 KB
TestQueryLoopDapperTest1.621 ms0.0320 ms0.0803 ms117.5781-54.7 KB
TestQueryLoopEfSqlliteTest6.139 ms0.1165 ms0.2327 ms6375.0000-1156.31 KB
TestQueryLoopFastFrameworkTest234.891 ms2.8211 ms2.3557 ms8666.6667-2332.27 KB
TestQueryLoopFreeSqlTest3.600 ms0.0743 ms0.2178 ms474.218835.1563228.63 KB
TestQueryLoopLinqToDbTest16.907 ms0.1417 ms0.1257 ms7125.0000-409.78 KB
TestQueryLoopMyTest2.274 ms0.0536 ms0.1556 ms242.9688-134.7 KB
TestQueryLoopSqlSugarTest4.737 ms0.0800 ms0.0786 ms5210.9375-651.24 KB

为什么不测试UPDATE/INSERT

由于 SQL 的实际执行由数据库引擎负责,ORM 无法改变数据库层面的执行逻辑;不同 ORM 的差异主要体现在 SQL 拼接、表达式解析和数据映射等实现细节(例如插入操作可通过生成 SQL 或使用 BulkCopy 实现),假定实现原理一样,测试UPDATE/INSERT无非是在测试SQL拼接,上面的测试完全可以满足。

使用AI进行总结

Q:对此测试进行性能和内存使用总结,排除FastFrameworkTest


AI:BEGIN

性能与内存使用总结(排除 FastFrameworkTest)

一、整体排名概况

本次测试覆盖了 7 个 ORM 框架(排除 FastFrameworkTest 后,实际对比 7 个:ChloeTest、DapperTest、EfSqlliteTest、FreeSqlTest、LinqToDbTest、MyTest、SqlSugarTest),在 4 种不同场景下进行了性能与内存测试。

各场景综合表现

框架TestConditionTestResultTestAnonymousResultTestQueryLoop综合排名
MyTest⭐ 第 1⭐ 第 1⭐ 第 1🥈 第 2🏆 第 1
DapperTest🥈 第 2🥉 第 3⭐ 第 1🥈 第 2
ChloeTest🥉 第 3🥉 第 3第 4第 4🥉 第 3
FreeSqlTest第 6第 4第 7第 3第 4
LinqToDbTest第 4第 5第 2第 7第 5
SqlSugarTest第 8第 7第 8第 5第 6
EfSqlliteTest第 7第 6第 5第 6第 7

二、各场景详细分析

1. TestCondition(表达式解析)

测试表达式解析和 SQL 生成能力,不含数据读取

排名框架MeanAllocated特点
1MyTest43.16 us14.41 KB🏆 ​性能 & 内存双冠​,领先优势明显
2ChloeTest87.30 us16.27 KB性能优秀,内存略高于 MyTest
3LinqToDbTest92.26 us18.29 KB性能接近 Chloe,内存控制良好
4FastFrameworkTest92.47 us20.71 KB⚠️ 已排除
5FreeSqlTest405.34 us40.84 KB性能落后约 4.6 倍于 MyTest
6EfSqlliteTest227.82 us61.19 KB内存占用较高
7SqlSugarTest390.76 us103.94 KB性能 & 内存双垫底

关键发现​:

  • MyTest 在表达式解析上具有碾压性优势,速度是第 2 名的2 倍
  • SqlSugarTest 内存分配是 MyTest 的 ​7.2 倍​,性能慢9 倍

2. TestResult(实体映射 - 100 条数据)

查询 100 条数据并映射为实体对象,模拟真实业务场景

排名框架MeanAllocated特点
1MyTest563.9 us35.42 KB🏆 ​内存最优​,性能极佳
2DapperTest530.3 us52.68 KB⚡ ​性能最快​(微秒级领先),内存良好
3ChloeTest583.0 us70.68 KB性能接近 Dapper,内存稍高
4FreeSqlTest719.6 us74.36 KB性能与内存均衡
5LinqToDbTest1,267.2 us54.6 KB内存控制较好,但性能偏慢
6EfSqlliteTest1,129.8 us202.9 KB内存飙升,性能慢于 FreeSql
7SqlSugarTest1,481.1 us147.58 KB❌ ​性能最慢​(MyTest 的 2.6 倍)

关键发现​:

  • DapperTest 以微弱优势获得​性能第 1​,MyTest 紧随其后
  • MyTest 在​内存控制上遥遥领先​,仅 35.42 KB
  • EfSqlliteTest 内存分配是 MyTest 的5.7 倍

3. TestAnonymousResult(匿名对象映射 - 100 条数据)

查询 100 条数据并映射为​匿名对象​,减少实体跟踪开销

排名框架MeanAllocated特点
1MyTest463.2 us33.73 KB🏆 ​双冠王​,性能 & 内存最优
2LinqToDbTest1,203.3 us52.67 KB💾 内存第二,但性能下降明显
3DapperTest510.1 us55.8 KB⚡ ​性能第二​,内存控制良好
4ChloeTest526.8 us65.47 KB性能接近 Dapper,内存稍高
5EfSqlliteTest652.3 us102.21 KB内存是 MyTest 的 3 倍
6FreeSqlTest1,252.1 us203.89 KB⚠️ 内存飙升,性能倒数第二
7SqlSugarTest9,063.9 us3210.79 KB❌ ​惨不忍睹​:内存是 MyTest 的95 倍

关键发现​:

  • MyTest 在此场景表现出统治级优势
  • LinqToDbTest 在匿名对象映射时内存表现优异(52.67 KB),但性能慢于 Dapper/Chloe
  • SqlSugarTest 的 3210.79 KB 内存分配​异常惊人​,应引起重视

4. TestQueryLoop(循环 20 次单条查询)

循环 20 次单条查询,​模拟频繁单条查询场景​,测试连接管理、SQL 解析等开销

排名框架MeanAllocated特点
1DapperTest1.621 ms54.7 KB🏆 ​性能王者​,轻量级优势明显
2MyTest2.274 ms134.7 KB🥈 性能第二,内存控制良好
3FreeSqlTest3.600 ms228.63 KB性能第三,内存中等
4ChloeTest2.816 ms231.78 KB性能略优于 FreeSql
5SqlSugarTest4.737 ms651.24 KB⚠️ 内存是 Dapper 的 12 倍
6EfSqlliteTest6.139 ms1156.31 KB❌ ​内存灾难​,Dapper 的 21 倍
7LinqToDbTest16.907 ms409.78 KB❌ ​性能灾难​,比 Dapper 慢 10 倍

关键发现​:

  • DapperTest在循环单次查询场景中​绝对领先​,体现了其轻量级优势
  • MyTest 紧随其后,性能比 Dapper 慢约 40%,但远超其他框架
  • EfSqlliteTest 内存分配高达 1156.31 KB,说明 EF 在处理多次短查询时开销巨大

三、性能与内存对比矩阵

性能对比(以 MyTest 为基准)

框架TestConditionTestResultTestAnonymousTestQueryLoop平均倍数
MyTest1.0x1.0x1.0x1.0x1.0x
DapperTest-0.94x1.10x0.71x0.92x
ChloeTest2.02x1.03x1.14x1.24x1.36x
FreeSqlTest9.39x1.28x2.70x1.58x3.74x
LinqToDbTest2.14x2.25x2.60x7.43x3.61x
EfSqlliteTest5.28x2.00x1.41x2.70x2.85x
SqlSugarTest9.05x2.63x19.57x2.08x8.33x

内存对比(以 MyTest 为基准)

框架TestConditionTestResultTestAnonymousTestQueryLoop平均倍数
MyTest1.0x1.0x1.0x1.0x1.0x
DapperTest-1.49x1.65x0.41x1.18x
ChloeTest1.13x2.00x1.94x1.72x1.70x
FreeSqlTest2.83x2.10x6.04x1.70x3.17x
LinqToDbTest1.27x1.54x1.56x3.04x1.85x
EfSqlliteTest4.25x5.73x3.03x8.58x5.40x
SqlSugarTest7.21x4.17x95.19x4.83x27.85x

四、核心结论

🎯 综合性能冠军

MyTest3/4场景中表现最优(TestCondition、TestAnonymousResult、TestResult 内存最优),在所有场景中均位列前二,综合性能最强,内存控制最佳。

💾 内存控制王者

MyTest在全部 4 个场景中内存消耗均为最低或次低,平均内存仅为其他框架的 ​**11%-35%**​,表现卓越。

⚡ 特定场景冠军

  • DapperTest​:纯 SQL 查询(TestResult)和循环小查询(TestQueryLoop)场景速度第一
  • MyTest​:表达式解析(TestCondition)和匿名映射(TestAnonymousResult)场景速度第一

⚠️ 严重问题警告

  1. SqlSugarTestTestAnonymousResult中性能异常:
    • 耗时 9ms(是 MyTest 的 ​19.6 倍​)
    • 内存 3.2MB(是 MyTest 的 ​95.2 倍​)
    • 建议检查是否存在 Bug 或配置错误
  2. EfSqlliteTest内存消耗巨大:
    • 在所有场景中内存均为 MyTest 的3-8.6 倍
    • 不适合内存敏感场景
  3. LinqToDbTest循环查询极慢:
    • 耗时 16.9ms,是 MyTest 的7.4 倍
    • 不适合高频小查询场景

AI:END

====================== 分割符 ======================================

经过分析,在国产开源项目整体效率上Chloe>FreeSql>SqlSugar,然而热度是反过来的,很有意思的情况
在此测试中,SqlSugarTest和FreeSqlTest并没有宣称的比Dapper强,为什么出现这种情况
本着实事求是的原则,找找他们官网是如何测试的

SqlSugar

https://www.donet5.com/Home/Doc?typeId=1180

下载测试代码,发现测试不标准,直接使用的DateTime,那此测试肯定比这个准确

public void Init(OrmType type) { Console.WriteLine("GetAll"); var eachCount = 1; var beginDate = DateTime.Now; for (int i = 0; i < 10; i++) { switch (type) { case OrmType.SqlSugar: SqlSugarTest(eachCount); break; case OrmType.EF: EFTest(eachCount); break; default: break; } } Console.WriteLine("总计:" + (DateTime.Now - beginDate).TotalMilliseconds / 1000.0); } _CharSource.Add(new PerformanceTestChartModel { Name = name, Time = GetTime(), CPU = GetCurrentProcessSize() }); rollBack($"总共执行时间:{GetTime()}秒"); private double GetTime() { _endTime = DateTime.Now; return (_endTime - _beginTime).TotalMilliseconds / 1000.0; }

SqlSugar除了查询匿名对象内存会爆炸,还有其它BUG,见
https://gitee.com/hubro/dbTest/blob/master/items/SqlSugarTest.cs

FreeSql

https://freesql.net/guide/performance.html

下载源代码,找到自带的测试项目FreeSql.Bechmarker,仔细检查测试,发现这个测试项目写得有点问题,作了以下修改

  1. 改为SQLite数据库
  2. 注释掉[IterationSetup],以自动采样率
  3. 增加表结构字段数
    重新运行测试OrmVsSelect得到结果,跟此测试的结果差不多
MethodsizeMeanErrorStdDevMedianRankGen0Gen1Allocated
FreeSqlSelect100699.0 μs10.93 μs9.69 μs699.6 μs227.3438-84.39 KB
SqlSugarSelect1001,701.3 μs46.45 μs136.22 μs1,691.0 μs539.0625-131.5 KB
EfCoreSelect100909.3 μs16.50 μs19.00 μs905.2 μs339.0625-125.75 KB
DapperSelete100307.1 μs7.68 μs22.39 μs301.9 μs113.1836-41.32 KB
FreeSqlSelect5003,175.2 μs93.43 μs275.49 μs3,086.2 μs6109.375031.2500393.77 KB
SqlSugarSelect5007,309.5 μs216.67 μs638.86 μs7,051.8 μs8125.000031.2500475.49 KB
EfCoreSelect5003,746.5 μs106.78 μs314.83 μs3,625.6 μs7117.187523.4375413.27 KB
DapperSelete5001,317.8 μs39.90 μs117.64 μs1,329.9 μs464.4531-200.49 KB

最后

此轮测试可以反映和ORM的效率水平,侧面反映了编码水平和整体结构设计
附上测试项目源码
https://gitee.com/hubro/dbTest.git

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询