求助:.NET Core WebAPI 框架自动生成的 Controller 中的 get 全部对象的方法执行太慢

2021-11-16 10:48:45 +08:00
 libasten
框架自动生成的代码:

```
[HttpGet]
public async Task<ActionResult<IEnumerable<DocItem>>> GetDocItem()
{
return await _context.DocItem.ToListAsync();
}
```

数据库中 4000 条数据,执行这个 api 卡顿 2 分钟都没有反应。
不要后台分页的建议,因为需求是想一次性把这 4000 条都返回给前台。
4518 次点击
所在节点    .NET
77 条回复
shangsharon
2021-11-16 11:36:41 +08:00
数据库表单条记录很大吗?
你的 2 分钟是哪里统计的,可以计算一下服务端的执行耗时
liuhan907
2021-11-16 11:47:21 +08:00
这个慢肯定和框架无关,这么点代码不太会有什么问题。要说的话也就是你其它的配置可能会有问题。但是我觉得可能最大的还是你的数据库慢。
Nasei
2021-11-16 12:00:36 +08:00
先把性能探查器打开做个 profile ?
pixiaotiao
2021-11-16 12:01:54 +08:00
可以看下是不是数据传输慢
jones2000
2021-11-16 12:18:20 +08:00
不要用数据库,返回 4000 条随机数据看看是不是慢。 如果不慢, 找数据部门查问题吧, 不是开发的问题。
0o0o0o0
2021-11-16 12:23:56 +08:00
显然不是框架问题
thinkershare
2021-11-16 12:35:30 +08:00
可数据库打查询日志, 看下查询耗费的事件, 这个不可能是框架的问题!
skinny
2021-11-16 12:49:46 +08:00
这无论如何也没法把锅甩 .Net 吧,4000 条两分钟唉,可能数据库哪里有问题,而且也不一定是数据库方面的问题,你查查你的运行环境和系统状态吧
beginor
2021-11-16 12:52:57 +08:00
用 profiler 跟踪一下,很久之前碰到过类似的问题, 用 profiler 跟踪发现是没有写入日志文件的权限
hurrytospring
2021-11-16 13:13:07 +08:00
。。。这锅肯定不是从框架性能排查起的。。。
afirefish
2021-11-16 14:53:05 +08:00
我觉得这锅不应该甩到框架上面去。先查 1 条数据库试试。
quan01994
2021-11-16 15:06:13 +08:00
看你用的是 ef ,要不你打印一下 sql 看看

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLoggerFactory( );
}
libasten
2021-11-16 15:18:04 +08:00
@shangsharon 单表记录不大,十来个字段,每最长的字段里就一句 100 个字不到的文本,我说的 2 分钟,是我用 swagger 调试时候的粗略估计,实际上每次不止 2 分钟。

@skinny 没说是甩锅框架的啊,我就是发出来请教大家的,这也是微软成熟框架,我知道它 4000 条就卡成这样,所以才有疑惑。

@beginor 应该不是权限问题,因为我加了 where 条件,设置成 100 条以内的返回的话,快的很。


@quan01994 是用的 ef ,但是这是我第一次用 net core 框架,不怎么熟悉,请问你贴的这个是在 startup.cs 文件里面配置的吗?
INCerry
2021-11-16 15:36:34 +08:00
测试性能就不要用 DEBUG 模式,切到 Release ,另外 EF 框架是需要预热一下,你可以试试第二次、第三次应该就快了
dawnh
2021-11-16 15:58:57 +08:00
试试看不要用 ToListAsync(),而是 ToList()之后再返回结果。印象里看到过一些 SO 上关于 ToListAsync 在 EF 莫名其妙慢的问题。
gowk
2021-11-16 16:16:58 +08:00
ToList 的时候调用下 AsNoTracking 试试
iold
2021-11-16 16:28:33 +08:00
即使第一次这点数据也不会用你这么多时间的. 看你这几行代码,如果只读,你可以使用 AsNoTracking,剩下的自己看官方文档吧, https://docs.microsoft.com/zh-cn/ef/ef6/fundamentals/performance/perf-whitepaper?redirectedfrom=MSDN
Buges
2021-11-16 16:42:07 +08:00
有没有可能是你的哪个 async 操作 block 了?
c#一个 gc 语言 async 做的难用程度都快赶上 rust/cpp 了。
Removable
2021-11-16 16:52:50 +08:00
@Buges #18 😂啊,C#的 async 我感觉很方便啊,哪里难用了
Buges
2021-11-16 17:06:35 +08:00
@Removable 语法啥的先不说,最主要的是 colored function 和 blocking 的问题。有运行时的语言 goroutine 或 actor 都是不错的模式,kotlin coroutine 实现的 structured concurrency 也还可以。相比之下 c# 和 py 等 (js 由于异步单线程的原因感觉上还好) 就比较难用了,当然 rust/cpp 这些无 gc 语言还有内存管理 pin 之类的问题更加痛苦。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/815708

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX