-
.NET 6 EFCore WebApi 使用 JMeter 进行吞吐量测试
重要补充说明(放在最前面)
博客中EFCore测试结果比其它ORM快的原因
涉及博客《ORM增删改查并发性能测试》《ORM增删改查并发性能测试2》《.NET 6 EFCore WebApi 使用 JMeter 进行吞吐量测试》
测试代码中EFCore的多字段排序写法不正确,导致生成的SQL不正确,SQL中只有Id排序,没有CreateTime字段的排序!
EFCore不正确的多字段排序写法
string remark = "测试";
int id = 20;
var list = await _db.Set<SysUser>().AsNoTracking()
.Where(t => t.Id > id && t.RealName.Contains(remark))
.OrderByDescending(t => t.CreateTime)
.OrderBy(t => t.Id).Skip(1800).Take(200).ToListAsync();
EFCore正确的多字段排序写法
string remark = "测试";
int id = 20;
var list = await _db.Set<SysUser>().AsNoTracking()
.Where(t => t.Id > id && t.RealName.Contains(remark))
.OrderByDescending(t => t.CreateTime)
.ThenBy(t => t.Id).Skip(1800).Take(200).ToListAsync();
重新测试EFCore
测试命令:
第一轮:
跟其它ORM差不多。
第二轮:
跟其它ORM差不多。
代码:
.NET 6 EFCore WebApi 使用 JMeter 进行吞吐量测试
开发环境
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. 不要说代码怎么写的,我要看测试结果。
测试工程地址
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数