2009-07-28 14 views

Respuesta

17

no se olvide de los métodos de extensión son sólo las llamadas a métodos estáticos envueltas en azúcar sintáctico. Así que lo que realmente está pidiendo no es

una diferencia de rendimiento entre los métodos estáticos y de instancia

La respuesta es sí y hay varios artículos disponibles sobre este tema

Algunos enlaces

+0

Tenía la esperanza de que añadiera algunas citas a estos artículos, ya que aún no he encontrado ninguno. Tal vez estoy poniendo los términos incorrectos en google. –

+0

@Colin yo también :). Supongo que no presioné enviar la última vez. Intente buscar en Google el "rendimiento de la llamada al método CLR" La mayoría de los artículos adoptan un enfoque general, pero analizarán las diferencias entre instancias y estáticas. – JaredPar

+0

Gracias - Parece una buena lectura ... Volveré en breve :) –

5

Dudo que hubiera alguna diferencia de rendimiento porque es todo azúcar sintáctico. El compilador solo lo compila como cualquier otra llamada a método, excepto que se trata de un método estático en una clase diferente.

Algunos detalles más de mi blog sobre el azúcar sintáctico: http://colinmackay.co.uk/2007/06/18/method-extensions/

+0

-1 En tu blog, estás comparando un método estático con un método estático. Eso es diferente a un método de instancia ... –

+0

Esa entrada de blog fue escrita hace más de dos años, y su propósito no era responder a esta pregunta exacta.Mi inclusión consistió en demostrar que los Métodos de extensión son azúcar sintáctica al mostrar la IL subyacente y cómo funcionan los métodos de extensión en general. ¡Pero, gracias por votar abajo! –

0

Existe una pequeña diferencia de rendimiento, debido a la cantidad de argumentos que se pasan al método. Por ejemplo, mira las siguientes clases:

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++; 
    } 
} 

ejecutando el siguiente código:

 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 seg

te = 0,2655 seg

debido al hecho que el método de instancia no tiene que pasar ningún argumento.

heres un artículo un poco anticuado, pero bueno en el rendimiento

+1

¿Qué sucede con la referencia "this" en una llamada a un método de instancia? ¿A dónde va eso? ¿Cómo se pasa eso? El método necesita obtenerlo de alguna parte? –

+0

esencialmente IncrementInstance y IncrementStatic llaman al método Set para la propiedad MyProperty. El método de instancia se refiere directamente a la memoria de instancia, mientras que el método estático se refiere a la instancia pasada como un argumento. –

+1

Curiosamente, tomé su código y lo ejecuté en mi máquina. Cuando uso la misma cantidad de iteraciones que los números, los números se superponen. A veces los métodos de instancia ganan, a veces los métodos de extensión. Me imagino que el temporizador no es lo suficientemente bueno, así que establecí las iteraciones en más de 2 billones (int.MaxValue) y ahora estoy obteniendo resultados bastante consistentes. Una iteración que utiliza el método de instancia tarda 46 nanosegundos en completarse, y una iteración que utiliza el método de extensión tarda 45 nanosegundos en completarse. No creo que vaya a optimizar nada de una manera u otra en función de un nanosegundo de diferencia. –

3

no hace ninguna diferencia significativa. Ver this article.

He verificado los resultados de la prueba e hice otra prueba donde la variante estática tenía un parámetro con el tipo Sample. Todos ellos tomaron 11495ms (+/- 4ms) en mi sistema para 2,1 billones de llamadas. Como dice el artículo, no deberías preocuparte por esto.

La mayoría de los ejemplos y pruebas aquí no son válidos porque permiten la alineación de métodos. Especialmente fácil en el compilador si el método está vacío;)

(es interesante ver que la prueba fue más lenta en mi sistema que la del artículo ... no es exactamente lenta, pero podría deberse al sistema operativo de 64 bits)

+0

Ese enlace ya no funciona ... – takrl

+0

Estoy consultando con el autor si hay otro sitio donde lo puso en línea. Mientras tanto, puedes leerlo en http://web.archive.org/web/20090624234442/http://gregbeech.com/blogs/tech/archive/2007/01/11/static-vs-instance-method -performance.aspx – Thorarin

+0

Bien, gracias, revisé su blog actual también pero ya no estaba allí. – takrl

Cuestiones relacionadas