- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
<分区>
查看我今天使用性能分析器处理的 Web 应用程序的一部分。我以为 Union 导致了一些延迟,但发现了其他令人惊讶的结果。
减速的原因之一似乎是 FirstOrDefault。
这是一个非常简单的 LINQ 查询,如下所示:
foreach(Report r in reports)
IDTOStudy study = studies.FirstOrDefault(s => s.StudyID == r.StudyID);
我创建了一个小方法来复制我认为 FirstOrDefault 正在执行的行为。
private IDTOStudy GetMatchingStudy(Report report, IList<IDTOStudy> studies)
{
foreach (var study in studies)
if (study.StudyID == report.StudyID)
return study;
return null;
}
此方法将 FirstOrDefault 替换为如下所示:
foreach(Report r in reports)
IDTOStudy study = GetMatchingStudy(r, studies);
查看与性能分析器一起运行的新代码表明 FirstOrDefault
的完成时间是我的新方法的两倍。看到这一幕令人震惊。
我一定是对 FirstOrDefault()
查询做错了什么。它是什么?
FirstOrDefault()
是否完成了整个查询,然后取第一个元素?
我怎样才能加快速度并使用 FirstOrDefault()
?
编辑 1:
我注意到的另外一点是,探查器说我在这两种实现上都在用尽我的 CPU。这也是我不关心和没想到的事情。我添加的额外方法并没有减少尖峰,只是将其持续时间减半。
编辑 3:
将研究放入字典中极大地缩短了运行时间。这肯定会是提交代码的样子。不过不回答有关 FirstOrDefault 的问题。
编辑 2:
这是在一个简单的控制台应用程序中请求的示例代码。我的运行仍然表明,在大多数情况下,FirstOrDefault 需要更长的时间。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reactive.Linq;
using System.Reactive.Concurrency;
using System.Diagnostics;
namespace TestCode
{
public class Program
{
public List<IntHolder> list;
public static void Main(string[] args)
{
var prog = new Program();
prog.list = new List<IntHolder>();
prog.Add50000Items();
prog.list.Add(new IntHolder() { Num = 12345 });
prog.Add50000Items();
var stopwatch = new Stopwatch();
stopwatch.Start();
prog.list.FirstOrDefault(n => n.Num == 12345);
stopwatch.Stop();
Console.WriteLine("First run took: " + stopwatch.ElapsedTicks);
var lookingFor = new IntHolder() { Num = 12345 };
stopwatch.Reset();
stopwatch.Start();
prog.GetMatching(lookingFor);
stopwatch.Stop();
Console.WriteLine("Second run took: " + stopwatch.ElapsedTicks);
Console.ReadLine();
}
public void Add50000Items()
{
var rand = new Random();
for (int i = 0; i < 50000; i++)
list.Add(new IntHolder() { Num = rand.Next(100000) });
}
public IntHolder GetMatching(IntHolder num)
{
foreach (var number in list)
if (number.Num == num.Num)
return number;
return null;
}
}
public class IntHolder
{
public int Num { get; set; }
}
}
我遇到这样的问题:无论内部表达式如何计算,FirstOrDefault 始终返回它遇到的第一个项目。 假设我有一系列公司。 Companies = {Company1, Company2, Compa
我正在尝试在 IEnumerable 中搜索特定记录(使用谓词)。如果该记录不存在,我想返回第一条记录。如果那也不存在,我只想要 null。 我正在使用 var category = categori
有什么区别 FirstOrDefault(someField => someField.Name.Equals(settings.Text)) 和 Where(someField => someFie
使用 Linq to Entities 有以下区别吗? db.EntityName.Where(a => a.Id == id).FirstOrDefault(); db.EntityName.Fir
myCollection.Where(...).FirstOrDefault() 和 myCollection.FirstOrDefault(...) 之间是否存在性能差异 用您正在使用的谓词填充点。
我知道这个问题是asked a lot by people甚至有人说 So, first(FirstOrDefault(predicate)) one is better in terms of pe
有什么区别吗 DataFeedManager.LoadAllDataFeeds().FirstOrDefault(d => d.ItemID == itemId); 和 DataFeedManage
我一直在编写我的 LINQ 查询时使用 Where 子句中的谓词,后跟 FirstOrDefault 子句。我开始在 FirstOrDefault 子句中看到带有谓词的示例。 这个比那个好吗? EF
这两个 Linq 查询有什么区别: var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault(); // vs. va
我有点好奇,当谈到 FirstOrDefault 时,哪种被认为是“最佳实践”。 我已经看过这个问题,它与我的问题相似,但还不够接近,无法回答我的问题。 其中哪一个是“更好的代码”?为什么? var
FirstOrDefault() and FirstOrDefault() 有什么区别?在 LINQ 中? 有人能给我一些简单的解释吗? TypedDataSet ds= codeComponent.
我想声明如下: var block = blocksById.FirstOrDefault(X => X.Value == tracResult.ID).Key 我的问题是如果我有 FirstOrDe
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
这个问题在这里已经有了答案: EF Where(x => x.ColumnVal == 1) vs FirstOrDefault(x => x.Column == 1) (3 个答案) 关闭 9 年
我一直在清理一些旧代码,并遇到了以下结构的一些查询: var attribute = DbSet.Where().Select(a => a.Attribute).SingleOrDefault();
希望做一些重构......使用 NHibernate 我目前有这个查询 public Widget FindByCode(string code) { return
这里遇到了一种边缘情况问题。我的任务是将所有数据从一个数据库提取到另一个数据库,其中目标数据库具有不同的架构。 我选择编写一个 WinForms 实用程序来在必要时使用 Entity Framewor
下面是我编写的代码,由于 FirstOrDefault,它只返回第一条记录。获取存储在变量 EmailAddresses 中的所有电子邮件地址的语法应该是什么,其中 FlagActive 字段为 Tr
有两个主键a和b一键编译两把 key 怎么样 var product = db.TMP_HELLO.FirstOrDefault(instrmnt => (instrmnt.a == good.a;
当使用 Enumerable.FirstorDefault() 时,我是否需要始终捕获当操作的集合为 null 时可能抛出的 ArumentNullException? 过去我总是这样做: Workf
我是一名优秀的程序员,十分优秀!