【发布时间】:2011-08-24 11:22:27
【问题描述】:
这更像是一个技术性的“操作方法”或“最佳方法”问题。
我们当前的需求是从数据库中检索记录,将它们放入“内存中”列表,然后对数据执行一系列计算,即最大值、平均值和一些更具体的自定义统计数据。
将数据放入“内存中”列表不是问题,因为我们使用 NHibernate 作为我们的 ORM,它在从数据库中检索数据方面做得很好。我正在寻求的建议是我们应该如何最好地对结果数据列表进行计算。
理想情况下,我想为每个统计数据创建一个方法,MaximumValue()、AverageValueUnder100()、MoreComplicatedStatistic() 等。当然,将所需的变量传递给每个方法并让它返回结果。这种方法还可以让单元测试变得轻而易举,并为我们提供出色的覆盖率。
如果我们为每个计算执行一个 LINQ 查询,或者应该在尽可能少的 LINQ 查询中合并对每个统计方法的尽可能多的调用,是否会影响性能。例如,将数据列表传递给一个名为 AverageValueBelow100 的方法,然后将整个数据列表传递给另一个方法 AverageValueBelow50,这样可以有效地使用一个 LINQ 查询来执行它们是没有多大意义的。
我们如何在不牺牲性能的情况下实现高粒度和分离度?
任何建议......问题是否足够清楚?
【问题讨论】:
-
最好的方法是对数据库执行查询,您可以利用索引来提高性能
-
真的吗?因此,与其处理“内存中”,不如查询数据库。一些计算非常复杂,所以我不完全确定这是最好的方法。
-
大多数情况下数据库更快
-
@Rowen 数据库也在“内存中”执行此操作,但它具有额外的信息,例如内置索引,可以在执行计算时以低得多的时间复杂度进行一些查找。
-
Linq 不能比每个定义的 DB 快。怎么会这样?它只是在上面执行 SQL。不能比在数据库上执行相同的 SQL 更快。您可能想要构建 IQueryables,而不是拉入列表,您可以在其上“堆叠”不同的 Linq 表达式并延迟执行,这样您就只执行您想要的并且与您需要的数据相关。
标签: c# linq performance list