c# - "Closure over variable gives slightly worse performance"。如何?

标签 c#

在回答 SO 问题时,我被告知我的解决方案将引入一个变量闭包,因此它的性能会稍差一些。所以我的问题是:

  1. 如何关闭?
  2. 它将如何影响性能?

这是 question

List.Where(s => s.ValidDate.Date == DateTime.Today.Year).ToList();

这是我的 solution .我引入了变量 yr 来存储年份。

int yr = DateTime.Now.Year;
List.Where(s => s.ValidDate.Year == yr).ToList();

它在答案的 comments

最佳答案

首先,这两种解决方案在功能上并不等同(如果您将日期与 int (.Date == .Today.Year) 进行比较):

  • 第一个代码片段为列表的每个值重新计算 DateTime.Today.Year,当当前年份在迭代期间发生变化时,它可以给出不同的结果

  • 第二个片段存储当前年份并重复使用它,因此结果列表中的所有项目都将具有相同的年份。 (我个人会采用这种方法,因为我想确保结果正常)。

引入闭包是因为 lambda 从其外部范围访问变量,它关闭了 yr 的值。 C# 编译将生成一个新类,其中包含一个包含 yr 的字段。所有对 yr 的引用都将替换为新字段,原始 yr 甚至不会存在于编译后的代码中

我怀疑引入闭包会降低性能。如果有的话,使用闭包的代码会更快,因为它不必为每个列表项创建新的 DateTime 实例,然后取消引用两个属性。它只需要访问编译器生成的包含当前年份的 int 值的闭包类的字段。 (有人想比较生成的 IL 代码或分析这两个片段吗?:))

关于c# - "Closure over variable gives slightly worse performance"。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24711196/

相关文章:

c# - Razor View 中的简写 If without else (ASP.NET MVC4)

c# - 在方法中使用 IncludeMultiple

c# - 使用FMOD查找以Hz为单位的频率

c# - 在 C# 中定义具有灵活维度的 Func

c# - 适合初学者的 WPF 或 Winforms?

c# - 使用更新进度 C#.NET 时更新面板内的 Response.Redirect

c# - .NET 中的 "Conditional Operator (?:)"或 "if...else"哪个最好用?

c# - 如何使用 C# 在 API 中加载 Revit 文件?

c# - 从文件中提取字符串并使用 c# 保存在另一个文件中

c# - 迭代语句 : Ends the iteration statement itself, 或不可见的空语句之后的语句终止符 (;) 运算符?