LINQ中DateTime比较的性能表现

4
例如,我有一些数据源(可能是数据库),需要从中提取过去一个月的所有记录。我使用LINQ。有两种可能的方法可以实现这一点:
第一种方法:
var res = from rec in _records
          where rec.RequestDateTime.Date.Year == date.Year &&
                rec.RequestDateTime.Date.Month == date.Month
          select rec;

第二种方法(使用日期直接比较):

var year = date.Year;
var month = date.Month;

var monthStart = new DateTime(year, month, 1);
var monthEnd = new DateTime(year, month, DateTime.DaysInMonth(year, month));

var res = from rec in _records
          where rec.RequestDateTime.Date >= monthStart &&
                rec.RequestDateTime.Date <= monthEnd
          select rec;

我听说第二种代码在大多数LINQ提供程序中运行更快,但是找不到任何证据或解释(或者反驳)。所以,哪种方法实际上更好用以获得更好的性能,为什么?


你的性能分析结果告诉你什么? - Rune FS
@Rune FS,遗憾的是,分析并不能解释为什么... - kyrylomyr
正确,它仅回答了您问题的第一部分。 - Rune FS
1个回答

12

我认为会更进一步 - 对于几乎所有的提供商(尤其是LINQ-to-Objects),它都会工作得更快。当谈到索引数据时 - 数据库索引通常是排序的,因此基于范围进行选择非常快捷和简单。 >=<= 不需要解释,可以直接跳转到所需的范围。非常快速。但是,如果您正在比较年份和月份,则有两个选择:

  • 计算年/月(基于日期支撑下的数字值),并进行相等比较 - 注意它可能无法使用索引,而需要进行全面扫描
  • 做一些非常聪明的思考来确定它是一个范围(使查询解析更复杂)

对于最简单的情况(LINQ-to-Objects),也是如此;>=等非常容易 - 这是数字比较。测试月份/年份需要计算月份/年份。这些数据并没有以整数的形式存储,并且也不是直接可用的。是的,计算费用不是很高,但是在考虑大量日期时,也不是免费的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接