Yanıtlar:
Temsilci bir örneğiniz olduğunda, türü tam olarak biliyor olabilirsiniz veya yalnızca bir Delegate
. Tam türü biliyorsanız, kullanabilirsiniz Invoke
, ki bu çok hızlıdır - her şey zaten önceden doğrulanmıştır. Örneğin:
Func<int,int> twice = x => x * 2;
int i = 3;
int j = twice.Invoke(i);
// or just:
int j = twice(i);
Ancak! Sadece bunun olduğunu biliyorsanız Delegate
, parametreleri vb. Manuel olarak çözmesi gerekir - bu kutudan çıkarmayı içerebilir, vb - çok fazla yansıma oluyor. Örneğin:
Delegate slowTwice = twice; // this is still the same delegate instance
object[] args = { i };
object result = slowTwice.DynamicInvoke(args);
Not args
Uzun eli object[]
, an'ın dahil olduğunu açıkça belirtmek için yazdım . Burada çok fazla ekstra maliyet var:
MethodInfo
Temel olarak, DynamicInvoke
elinizden geldiğince kaçının . Invoke
sahip olduğunuz tek şey a Delegate
ve bir olmadığı sürece her zaman tercih edilir object[]
.
Performans karşılaştırması için, hata ayıklayıcının (bir konsol exe) dışında yayın modunda aşağıdakiler yazdırılır:
Invoke: 19ms
DynamicInvoke: 3813ms
Kod:
Func<int,int> twice = x => x * 2;
const int LOOP = 5000000; // 5M
var watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++)
{
twice.Invoke(3);
}
watch.Stop();
Console.WriteLine("Invoke: {0}ms", watch.ElapsedMilliseconds);
watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++)
{
twice.DynamicInvoke(3);
}
watch.Stop();
Console.WriteLine("DynamicInvoke: {0}ms", watch.ElapsedMilliseconds);
Invoke: 0,0478ms, DynamicInvoke: 0,053ms
. Neden onları 1'den fazla aramayla karşılaştırıyorsunuz? Ve neden birincisi ikinci işlev çağrısından daha uzun sürüyor?