【发布时间】:2021-06-14 07:10:55
【问题描述】:
我有一个无法优化的 LINQ 查询。运行大约需要 6 秒。
IList<Note> notes;
data = client.Configuration.Data.OfType<UWData>()
.Where(s => s.ShouldDisplay)
.OrderByDescending(s => s.Id)
.ToList()
.Select(n => (Note)n)
.ToList();
client.Configuration.Data 包含数十万条数据(100,000 项)。
client.Configuration.Data 是一个缓存,我正在从缓存中检索数据。
client.Configuration.Data 包含 100,000 个项目,我们有 10 个项目是 UWData 的类型。我要选择10个UWData。
var data = client.Configuration.Data.OfType<UWData>().ToList();
data = UWData
.Where(s => s.ShouldDisplay)
.OrderByDescending(s => s.Id)
.ToList()
.Select(n => (Note)n)
.ToList();
上面的代码也需要类似的时间来加载。 有时加载大约需要 4 秒(正好是 3,356 毫秒)。 关于如何加快速度的任何想法?
【问题讨论】:
-
性能取决于使用的数据库类型和大小。您可能无法加快结果。用于连接数据库的驱动程序也会影响速度。您正在使用什么数据库以及哪个驱动程序?请参阅以下驱动程序列表:connectionstrings.com
-
如果您从缓存中检索数据,那么为什么要使用
entity-framework标签?删除标记并在问题中指定您正在运行 LINQ 内存查询(LINQ to Objects)。 -
请记住,我们大多数不住在印度的人都不知道什么是“十万数据”,他们充其量只能猜测是“缺乏数据”。所以请不要在这里使用印度词。
-
如果内存中有 10^5 个项目,您的问题可能不是发布的查询。线性,甚至
n log n复杂性,因为许多项目应该在几十到几百毫秒的数量级,而不是几秒钟。 使用分析器! -
那么在显示的代码中没有什么可以优化的。罪魁祸首显然是在
Data缓存实现中。您使用完全不清楚的“缓存”、“加载”等术语(人们假设缓存是某种列表,但随后就不会有加载之类的东西),所以您真的需要找出是什么原因造成的性能问题以及如何/是否可以改进。 “缓存”实现中的所有内容,我们无能为力。
标签: c# performance linq linq-to-objects