2009-07-28 16 views

risposta

17

non dimenticare i metodi di estensione sono chiamate a metodi statici solo avvolto in zucchero sintattico. Allora, cosa stai davvero chiedendo c'è

è una differenza di prestazioni tra i metodi statici e di istanza

La risposta è sì e ci sono vari articoli disponibili su questo argomento

Alcuni link

+0

Speravo che avessi intenzione di aggiungere alcune citazioni a questi articoli come non ho ancora trovato. Forse sto inserendo i termini sbagliati in google. –

+0

@Colin me too :). Immagino di non aver premuto invio l'ultima volta. Prova a cercare su google "Rendimento delle chiamate al metodo CLR" La maggior parte degli articoli ha un approccio generale, ma discuterà l'istanza con le differenze statiche. – JaredPar

+0

Grazie - Sembra una buona lettura ... Tornerò tra poco :) –

5

Vorrei dubitare che ci sarebbe qualche differenza di prestazioni perché è tutto zucchero sintattico. Il compilatore lo compila proprio come qualsiasi altra chiamata di metodo, tranne che per un metodo statico su una classe diversa.

Alcuni dettagli dal mio blog circa lo zucchero sintattico: http://colinmackay.co.uk/2007/06/18/method-extensions/

+0

-1 Nel tuo blog, stai confrontando un metodo statico con un metodo statico. È diverso da un metodo di istanza ... –

+0

Quel post di blog è stato scritto più di due anni fa e il suo scopo non era quello di rispondere a questa domanda esatta.La mia inclusione è stata per lo meno di dimostrare che i metodi di estensione sono zucchero sintattico mostrando l'IL sottostante e come funzionano i metodi di estensione in generale. Ma grazie per il down-voting! –

0

C'è una leggera differenza di prestazioni, a causa del numero di argomenti passati nel metodo. Ad esempio, guardare le seguenti classi:

public class MyClassInstance 
{ 
    public int MyProperty { get; set; } 

    public MyClassInstance(int prop) 
    { 
     MyProperty = prop; 
    } 

    public void IncrementInstance() 
    { 
     MyProperty++; 
    } 
} 

public static class MyClassStatic 
{ 
    public static void IncrementStatic(this MyClassInstance i) 
    { 
     i.MyProperty++; 
    } 
} 

eseguendo il codice seguente:

 DateTime d = DateTime.Now; 

     MyClassInstance i = new MyClassInstance(0); 

     for (int x = 0; x < 10000000; x++) 
     { 
      i.IncrementInstance(); 
     } 

     TimeSpan td = d - DateTime.Now; 

     DateTime e = DateTime.Now; 

     for (int x = 0; x < 10000000; x++) 
     { 
      i.IncrementStatic(); 
     } 

     TimeSpan te = e - DateTime.Now; 

td = 0,2499 sec

te = 0,2655 sec

dovuto al fatto che il metodo di istanza non deve passare alcun argomento.

heres un articolo un po 'datato, ma buono sulle prestazioni

+1

Cosa succede al riferimento "this" in una chiamata al metodo di istanza? Dove va? Come viene superato? Il metodo deve averlo da qualche parte? –

+0

essenzialmente IncrementInstance e IncrementStatic chiamano il metodo Set per la proprietà MyProperty. Il metodo di istanza fa riferimento direttamente alla memoria dell'istanza, mentre il metodo statico fa riferimento all'istanza passata come argomento. –

+1

Stranamente, ho preso il tuo codice e l'ho eseguito sulla mia macchina. Quando uso lo stesso numero di iterazioni mentre i numeri saltano l'uno sull'altro. A volte i metodi di istanza vincono, a volte i metodi di estensione. Immagino che il timer non sia abbastanza fine, quindi ho impostato le iterazioni su oltre 2 miliardi (int.MaxValue) e ora sto ottenendo risultati abbastanza coerenti. Un'iterazione che utilizza il metodo di istanza impiega 46 nanosecondi per essere completata e un'iterazione che utilizza il metodo di estensione impiega 45 nanosecondi per essere completata. Non ho intenzione di ottimizzare qualcosa in un modo o nell'altro in base a un nanosecondo di differenza. –

3

non fa alcuna differenza significativa. Vedi this article.

Ho verificato i risultati del test e ho eseguito un altro test in cui la variante statica aveva un parametro con tipo Sample. Tutti hanno preso 11495ms (+/- 4ms) sul mio sistema per 2,1 miliardi di chiamate. Come dice l'articolo, non dovresti preoccuparti di questo.

La maggior parte degli esempi e dei test qui non sono validi perché consentono l'inlining del metodo. Particolarmente facile sul compilatore se il metodo è vuoto;)

(interessante vedere che il test è stato più lento sul mio sistema rispetto a quello nell'articolo .. non è esattamente lento, ma potrebbe essere a causa del sistema operativo a 64 bit)

+0

Questo link non funziona più ... – takrl

+0

Sto verificando con l'autore se c'è un altro posto dove l'ha messo online. Nel frattempo, puoi leggerlo su http://web.archive.org/web/20090624234442/http://gregbeech.com/blogs/tech/archive/2007/01/11/static-vs-instance-method -performance.aspx – Thorarin

+0

Giusto, grazie, ho controllato anche il suo blog attuale ma non c'era più. – takrl

Problemi correlati