Esiste una differenza di prestazioni tra un metodo di istanza e un metodo di estensione?Metodo di estensione prestazioni rispetto al metodo di istanza
risposta
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
Speravo che avessi intenzione di aggiungere alcune citazioni a questi articoli come non ho ancora trovato. Forse sto inserendo i termini sbagliati in google. –
@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
Grazie - Sembra una buona lettura ... Tornerò tra poco :) –
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/
-1 Nel tuo blog, stai confrontando un metodo statico con un metodo statico. È diverso da un metodo di istanza ... –
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! –
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
Cosa succede al riferimento "this" in una chiamata al metodo di istanza? Dove va? Come viene superato? Il metodo deve averlo da qualche parte? –
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. –
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. –
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)
Questo link non funziona più ... – takrl
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
Giusto, grazie, ho controllato anche il suo blog attuale ma non c'era più. – takrl
- 1. Metodo astratto PHP rispetto al metodo predefinito
- 2. Lettura var statica dal protocollo di estensione metodo di istanza
- 3. Espressione lambda rispetto al metodo
- 4. metodo di estensione LINQ
- 5. Metodo di estensione Ignora
- 6. String.Format metodo di estensione
- 7. Riferimento al metodo di una particolare istanza in Kotlin
- 8. Come forzare l'uso del metodo di estensione invece del metodo di istanza con params?
- 9. Metodo statico di una classe statica rispetto al metodo statico di una classe non statica (C#)
- 10. Creazione di un oggetto: metodo del builder statico rispetto alla classe builder e al metodo di estensione
- 11. Sostituisci (o ombreggia) un metodo con metodo di estensione?
- 12. Utilizzo del metodo statico rispetto al metodo dell'oggetto
- 13. Delegare i metodi di istanza al metodo di classe
- 14. C# Precedenza metodo estensione
- 15. Riportare il metodo DbContext.Detach() con un metodo di estensione (EF5)
- 16. Modifica istanza di classe all'interno di un metodo di istanza
- 17. Metodo di estensione controllo nullo
- 18. Metodo di estensione per Enumerable.Intersperse?
- 19. ActionMailer metodo di istanza viene utilizzato come metodo di classe
- 20. Rails: metodo di istanza del modello o metodo di supporto?
- 21. Come intercettare le chiamate al metodo di istanza?
- 22. Perché il metodo Static nasconde il mio metodo di istanza?
- 23. risultato installazione per chiamata al metodo di estensione
- 24. Regole di categorizzazione metodo di estensione Monticello
- 25. Modificare ValueType dal metodo di estensione?
- 26. Esempio di un metodo di istanza? (Java)
- 27. chiamata metodo di istanza dal metodo della classe
- 28. Javascript estensione prototipo metodo
- 29. Cosa passare al metodo di istanza Array su array (metodo T [] a)?
- 30. Come nascondere un metodo membro da un metodo di estensione
Scrivere il codice in entrambe le direzioni. Prendi un cronometro. Allora lo saprai. –