最近有件事引起了我的好奇心。
当他们做同样的事情时,为什么该Enumerable.Any(Func<TSource, bool> predicate)方法比手动 foreach慢得多?
我一直在搞乱一些基准并想到了这一点。我正在检查List<int>大约位于列表一半的内容和项目。
以下是我对几种不同大小的列表的测试结果:
项目:1 000,搜索项目:543
| 方法 | 意思是 | 比率 | 已分配 | 分配比例 |
|---|---|---|---|---|
| 福里奇 | 838.3纳秒 | 1.00 | - | 不适用 |
| 任何 | 3,348.8 纳秒 | 4.05 | 40乙 | 不适用 |
项目:10 000,搜索项目:5 432
| 方法 | 意思是 | 比率 | 已分配 | 分配比例 |
|---|---|---|---|---|
| 福里奇 | 7.988 我们 | 1.00 | - | 不适用 |
| 任何 | 30.991 我们 | 3.88 | 40乙 | 不适用 |
项目:100 000,搜索项目:54 321
| 方法 | 意思是 | 比率 | 已分配 | 分配比例 |
|---|---|---|---|---|
| 福里奇 | 82.35 我们 | 1.00 | - | 不适用 |
| 任何 | 328.86 我们 | 4.00 | 40乙 | 不适用 |
有两个基准:
foreach带有if语句的手册基本上,我有一个使用 EF Core 的项目。为了在比较两个对象(协议类)是否相等时缩短 lambda,我重写了 Equals 方法并重载了 == 和 != 运算符。然而,LINQ似乎并不关心它,仍然使用引用来确定相等性。谢谢
正如我之前所说,我重写了 Equals 方法并重载了 == 和 != 运算符。没有运气。我还尝试过实现 IEquatable 接口。也没有运气。
我正在使用:EF Core 2.2.4
//协议类
[Key]
public int ProtocolId {get;set;}
public string Repnr {get;set;}
public string Service {get;set;}
public override bool Equals(object obj)
{
if (obj is Protocol other)
{
return this.Equals(other);
}
return false;
}
public override int GetHashCode()
{
return $"{Repnr}-{Service}".GetHashCode();
}
public bool Equals(Protocol other)
{
return this?.Repnr == other?.Repnr && this?.Service == other?.Service;
}
public static bool …Run Code Online (Sandbox Code Playgroud)