LINQ中日期时间比较的性能

本文关键字:性能 比较 时间 日期 LINQ | 更新日期: 2023-09-27 18:04:11

例如,我有一些数据源(可能是数据库),我需要从中提取上个月的所有记录。我用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提供程序中工作得更快,但找不到任何证明或解释(或反驳)。那么,使用哪种方法可以获得更好的性能,为什么呢?

LINQ中日期时间比较的性能

我想更进一步——在我看来,对于几乎所有的提供者(尤其是LINQ-to-Objects)来说,它会更快地工作。当讨论索引数据数据库索引通常是排序的,因此根据范围进行选择非常非常快速和容易。>=<=不需要解释,可以非常快速地直接跳到所需范围。但是,如果要比较年份和月份,则有两个选择:

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

对于最简单的情况(LINQ-to-Objects)也是如此;>=等是微不足道的-它是一个数字比较。测试月/年需要计算月/年。该数据没有显式地存储为整数,也不是直接在手机上。是的,计算并不过于昂贵,但是当考虑到批量日期时,它也不是免费的。