SORU
12 EKİM 2012, Cuma


Çağırmak ve Dynamicİnvoke Arasındaki fark

Çağırmak arasındaki fark ve Temsilciler Dynamicİnvoke nedir? Bana bu iki yöntem arasındaki farkı açıklamak bazı kod örneği verin lütfen.

CEVAP
12 EKİM 2012, Cuma


Temsilci bir örneği varsa, tam türünü biliyor olabilir, ya da sadece Delegate olduğunu biliyor olabilir. Eğer tam olarak biliyorsanız, Invoke kullanabilirsinizçok hızlı- her şey zaten önceden doğrulanı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! Eğer sadece parametreleri vb el ile gidermek için vardır Delegate olduğunu biliyorsanız - bu, vb kutulama içerebilir - yansıma çok fazla oluyor. Örneğin:

Delegate slowTwice = twice; // this is still the same delegate instance
object[] args = { i };
object result = slowTwice.DynamicInvoke(args);

object[] bir işin içinde olduğunu açıkça ifade etmek args uzun eli yazdığım not. Ekstra masraf burada çok var:

  • dizi
  • geçirilen bağımsız değişkenleri doğrulamak bir "gerçek ** 11 . uygun
  • gerekli kutulama vb
  • yansıma çağırmak
  • sonra arayan bir dönüş değeri işlem yapmak gerekiyor

Temel olarak, şimdiye kadar ne zaman DynamicInvoke kaçının. Invoke Delegate object[] olmadığı sürece her zaman daha çok tercih edilir.

Performans karşılaştırması için serbest modu hata ayıklayıcı dışında aşağıdaki (konsol exe) baskılar

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);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Curso Online Gratuito

    Curso Online

    4 Aralık 2011
  • Mismag822 - The Card Trick Teacher

    Mismag822 -

    18 EKİM 2008
  • xdadevelopers

    xdadeveloper

    25 Aralık 2009