【发布时间】:2012-06-22 20:50:00
【问题描述】:
我有一个列表:收集用户,其中包含大约 100K+ 用户记录(所有用户对象都从数据库中完全加载,其中包含 Bio、First name、last name 等字段)。此集合在应用程序启动时从数据库中获取并保存在内存中。
然后我有这样的代码:
User cachedUser = users.FirstOrDefault(x => string.Equals(x.UserName, username,
StringComparison.CurrentCultureIgnoreCase));
我用来从这个集合中获取用户。但不知何故,我注意到这个操作非常慢。使用 Linq 查询大对象的内存集合时是否存在性能问题?我是否应该在每次想获得用户时调用数据库?
【问题讨论】:
-
你明白
FirstOrDefault是O(n),对吧?如果您有一个非常大的集合,则逐个检查每个项目将需要一些时间。 (并且 dbs 通常被索引)有多种方法可以加快速度,其中最重要的是将其放入字典中。你不这样做有什么原因吗? -
我想缓存所有认为出于性能原因会更好的用户,因为在我的应用程序的几乎每个页面上都调用了 GetUser() 方法。如果我使用字典,它会更快吗?是字典 O(1) 吗?还是我需要先对字典进行排序?
-
只需要缓存当前用户吗?您可以使用内置的
Session或Cache对象。 -
@BryanCrosby 不,我想缓存所有用户而不是当前登录的用户。
-
@RockySingh:您是否需要所有用户始终在每个页面上?如果没有,缓存一个子集。如果是的话,要么你的架构出了问题,要么你正在做一些非常时髦的事情:)
标签: c# asp.net performance linq .net-4.0