s.Va-6ren">
gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:55:11 24 4
gpt4 key购买 nike

在回答 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com