开发环境
VS2022+.NET 6
测试环境
测试工具
接口压力测试工具:JMeter
数据库
MySQL 5.7,数据库和 WebApi 服务在同一台服务器上,JMeter 在本人笔记本上。
测试设置
200 个线程并发,每个线程循环 50 次,共 10000 次请求。
接口代码
模糊查询、排序、分页查询第 10 页 200 条数据,参数化查询条件。
EFCore (第一轮请求),测试结果
服务程序部署到测试服务器上测试,连接 MySql 数据库。
吞吐量
只有 200 多
每个请求响应时间
最长 5 秒多
EFCore (第一轮请求结束后,20 秒内进行第二轮请求),测试结果
服务程序部署到测试服务器上测试,连接 MySql 数据库。经过第一轮 10000 个请求的充分预热,取第二轮 10000 个请求的测试结果。
吞吐量
1200 多
每个请求响应时间
不到 50 毫秒
线程占用
最大达到 143 个线程
EFCore (第一轮请求结束后,20 秒后进行第二轮请求),测试结果
吞吐量
1200
每次请求响应时间
100 毫秒
线程占用
只有 50 多个线程
使用 FactoryStartNew. StartNewThread
查询代码
FactoryStartNew. StartNewThread 代码
使用 FactoryStartNew. StartNewThread (第一轮请求),测试结果
服务程序部署到测试服务器上测试,连接 MySql 数据库。
吞吐量
不到 200
每个请求响应时间
最长 33 秒
使用 FactoryStartNew. StartNewThread (第一轮请求结束后,20 秒内进行第二轮请求),测试结果
吞吐量
1000 多
每个请求响应时间
200 毫秒以内
线程占用
高达 260 多个线程
使用 FactoryStartNew. StartNewThread (第一轮并发请求结束后,20 秒后进行第二轮请求),测试结果
吞吐量
只有 200 多
每个请求响应时间
最长达到了 30 秒
在等待创建线程,.NET 默认线程池,1 秒才增加一个线程
线程占用
高达 230 多个线程
对比 SqlSugar
同样的数据库,同样的数据,同样的查询,同样的 JMeter 测试设置,同样取第二轮测试结果。
吞吐量
395
每个请求响应时间
500 毫秒
对比 FreeSql
同样的数据库,同样的数据,同样的查询,同样的 JMeter 测试设置,同样取第二轮测试结果。
吞吐量
408
每个请求响应时间
不到 500 毫秒
对比 Dapper.LiteSql
吞吐量
480 多
每个请求响应时间
400 多毫秒
结论
1、EFCore 优秀,吞吐量和响应时间都非常优秀。
2、使用 FactoryStartNew. StartNewThread,能用,但有问题。
3、如果觉得自己的 ORM 没问题,那就没有问题了,谁没事闲的做这种测试,慢一点不会死人,用户多了并发多了就加机器,作者和用户永远也不会知道,明明可以达到 1000 的吞吐量,却一直用的 280 吞吐量的 ORM。
4、比 EFCore 慢不丢人。
5、不要说代码怎么写的,我要看测试结果。
测试工程地址
https://gitee.com/s0611163/Net6WebApiPerformanceTest
转自: cnblogs.com/s0611163/p/16711330.html