なぜId = 999999が述語を使用したラムダ式駆動型比較より高速ですか?オープン型述語がなぜそれよりも遅い
多分私のテスト自体は100%同じではないかもしれませんが、これは一般的な質問について何かを示すサンプルです:述語は一般的なId == 999999よりも遅いですか?
述部には150msがかかりますが、共通比較には125msがかかります。どこから来たの
違い/オーバーヘッド?あなたはなぜ私が25ミリ秒気にするのか聞いてみるかもしれませんまあ...私は階層型のfindメソッドでもオープン型の述語を使用していますが、そこには格差があります。
だから私はラムダ(各 "u"デリゲートを作成する)+述語が問題だと思いますか?セットアップに何が間違っていないのでしょうか?
public class UtilitiesTest
{
[Test]
public void Go()
{
var units = GetUnits();
DateTime d = DateTime.Now;
var item = units.testme<MyUnit>(u => u.Id == 999999);
TimeSpan t = DateTime.Now - d;
Debug.WriteLine(t.TotalMilliseconds + " ms");
var units1 = GetUnits();
DateTime d1 = DateTime.Now;
MyUnit item1 = null;
foreach (MyUnit unit in units1)
{
if (unit.Id == 999999)
{
item1 = unit;
break;
}
}
TimeSpan t1 = DateTime.Now - d1;
Debug.WriteLine(t1.TotalMilliseconds + " ms");
}
private IEnumerable<MyUnit> GetUnits()
{
for (int i = 0; i < 1000000; i++)
yield return new MyUnit() { Id = i };
}
}
class MyUnit
{
public int Id { get; set; }
}
public static T testme<T>(this IEnumerable<T> source, Predicate<T> condition) where T : class
{
foreach (T item in source)
{
if (condition(item))
{
return item;
}
}
return default(T);
}
あなたのメソッド名が変更されていると思います。 Test_LambdaメソッドはLambdasを持たず、Test_Equalityメソッドはラムダ – Stilgar
@Stilgar - 既に修正されていますが、よく見えます。最後の変更は、コードをより読みやすくするために間違っていました。 –
@Stilgarロブはそれを編集するために25秒を必要と:P – Pascal