¿Hay alguna diferencia de rendimiento entre un método de instancia y un método de extensión?Método de extensión de rendimiento vs. Método de instancia
Respuesta
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
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. –
@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
Gracias - Parece una buena lectura ... Volveré en breve :) –
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/
-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 ... –
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! –
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
¿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? –
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. –
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. –
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)
Ese enlace ya no funciona ... – takrl
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
Bien, gracias, revisé su blog actual también pero ya no estaba allí. – takrl
- 1. Método de extensión ReaderWriterLockSlim Rendimiento
- 2. C# Método estático vs instancia de objeto
- 3. String.IsNullOrBlank Método de extensión
- 4. VB.NET: imposible de usar Método de extensión en System.Object instancia
- 5. GetHashCode Método de extensión
- 6. método de extensión para un método C#
- 7. C# Método de extensión anterior
- 8. ¿Cómo forzar el uso del método de extensión en lugar del método de instancia con params?
- 9. FormatProvider vs. método de extensión contra la nueva clase
- 10. método de instancia de llamada de método de clase
- 11. Método de extensión para Enumerable.Intersperse?
- 12. Usando método estático vs. método de objeto
- 13. + = new manejador de sucesos (Método) vs + = Método
- 14. ArgumentNullException o NullReferenceException del método de extensión?
- 15. Javascript extensión prototipo método
- 16. Cómo ocultar un método miembro por un método de extensión
- 17. ¿Por qué mi método estático oculta mi método de instancia?
- 18. Retorno de método de extensión usando genéricos
- 19. Método de extensión de comprobación nula
- 20. Cambio instancia de clase dentro de un método de instancia
- 21. Propiedad de extensión VB en lugar del método de extensión
- 22. Accessor Método de optimización de rendimiento y
- 23. Método de suscriptor vs evento
- 24. Diferencia de nivel bajo: clase no estática con método estático vs. clase estática con método estático
- 25. ¿Cómo resolver un método de extensión ambiguo?
- 26. C# - Clasificación utilizando el Método de extensión
- 27. Foreach con el Método de extensión IEnumerable
- 28. método de extensión genérico para AutoMapper
- 29. Método de extensión para Int32 en C#
- 30. Codificación HTML para HtmlHelper Método de extensión
Escribe el código en ambos sentidos. Saca un cronómetro. Entonces sabrás. –