gpt4 book ai didi

c# - 为什么 LINQ 中的 LastOrDefault(predicate) 比 FirstOrDefault(predicate) 更快

转载 作者:太空狗 更新时间:2023-10-29 18:26:18 32 4
gpt4 key购买 nike

简介

今天在测试某些 LinQ 函数的性能差异时,我注意到 LastOrDefault(predicate) 几乎总是比 FirstOrDefault(predicate) 快,这让我有点吃惊感兴趣,所以我写了一些测试用例,来测试这两个功能。

我创建了一个从 1 到 1 百万的 integer 值列表,如下所示:

List<int> l = new List<int>();
for (int i = 1; i <= 1000000; i++)
{
l.Add(i);
}

然后写了2个方法first()last()

 static void first(List<int> l)
{
int e = l.FirstOrDefault(x => x == 500000);
int z = l.FirstOrDefault(x => x == 500000);
int d = l.FirstOrDefault(x => x == 500000);
int v = l.FirstOrDefault(x => x == 500000);
int f = l.FirstOrDefault(x => x == 500000);
}

我在一个 for 循环中运行了 1000 次,设置了一个断点,条件是在最后一次迭代后停止,但在我测试的每一个案例中,LastOrDefault 都更快。

测试用例

  • 两者都设置为列表中间的一个元素(LastOrDefault 几乎快了一倍)
  • 两者都设置为列表中具有相同距离的元素(例如 250k 和 750k)- 同样 LastOrDefault 更快
  • 切换我的方法调用顺序(在 First() 之前调用 Last())- 没有区别
  • 用各自的列表运行两者,而不是在同一个列表上运行两者(同样没有区别)
  • 运行一个,关闭应用程序,重新打开,运行另一个(仍然是 LastOrDefault 更快)
  • 将谓词设置为不在列表中的元素(仍然相同)
  • 将谓词更改为 multipe 符合条件的对象(仍然相同)
  • 创建降序列表而不是升序列表(没有区别)

    .Net核心版本:3.0

由于调试器可能不准确,我用这段代码再次尝试:

  Console.WriteLine(DateTime.Now + ":" + DateTime.Now.Millisecond);
for (int i = 0; i < 1000; i++)
{
first(l);
}
Console.WriteLine(DateTime.Now + ":" + DateTime.Now.Millisecond);
for (int i = 0; i < 1000; i++)
{
last(l);
}
Console.WriteLine(DateTime.Now + ":" + DateTime.Now.Millisecond);

FirstOrDefault 返回 34 秒,LastOrDefault 返回 23 秒

enter image description here

问题

为什么 LastOrDefault 在我所有的测试用例中都比 FirstOrDefault 快得多?

最佳答案

steve16351在已删除的评论中指出,在 .NET Core 中,Last具有以下优化:

if (source is IList<TSource> list)
{
for (int i = list.Count - 1; i >= 0; --i)
{
TSource result = list[i];
if (predicate(result))
{
found = true;
return result;
}
}
}

但是First不会并最终运行:

foreach (TSource element in source)
{
if (predicate(element))
{
found = true;
return element;
}
}

很可能索引器访问列表元素比使用 foreach 和迭代器更快。相比之下,.NET Standard 没有针对 Last 的优化。 ,而不是遍历完整的输入,Last 的运行速度比您预期的 First 慢。

关于c# - 为什么 LINQ 中的 LastOrDefault(predicate) 比 FirstOrDefault(predicate) 更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57710766/

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