2010-03-17 9 views
10

¿Cuál es el costo de rendimiento relativo de llamar a un método por código en línea?¿Qué tan caras son las llamadas a los métodos en .NET

+1

¿Qué estás desarrollando por lo que estás tan preocupado por la llamada al método que consume mucho tiempo? –

+0

Un gran almacén de datos en memoria – Andrew

+1

¿Pariente? Probablemente un orden de magnitud. Pero no dejes que te engañe - (1/2,000,000,000)^10 sigue siendo un * muy * pequeño número. –

Respuesta

18

Eso dependerá de muchas cosas

  • Si el JIT inlines por usted
  • Ya sea virtual
  • El número y tamaño de los parámetros
  • Ya se trate de un método de instancia (con la implícita comprobación de nulidad)
  • Si hay un valor de retorno (y su tamaño si es así)

Es muy, muy poco probable que sea su cuello de botella. Como siempre, escriba el código más legible que pueda primero, y luego haga una evaluación comparativa para ver si funciona lo suficientemente bien. Si no es así, use un generador de perfiles para encontrar las zonas activas que pueden valdrá la pena micro-optimizar.

+0

en el caso de C# 2do punto es cuestionable. CSC emite 'callvirt' para cada método call – Andrey

+0

@Andrey: Usar' callvirt' en métodos no virtuales no impide que el JIT integre ese método. – Steven

+0

@Steven No dije que impida la alineación. Acabo de decir que virtual o no no afecta a la instrucción emitida – Andrey

3

Igual que en C++. Básicamente una llamada y un retorno, más parámetros de configuración. Sin embargo, tenga en cuenta que el JIT puede realizar llamadas a métodos en línea, por lo que puede no ser tan costoso en un contexto particular como usted piensa.

1

Insignificante. Cada llamada en .net, al menos para C# es una llamada virtual, incluso si el método no está marcado como virtual, considérelo.

+0

Esto no significa que sea una llamada virtual. 'callvirt' asegura que el JIT agrega una comprobación nula antes de llamar a cualquier método de instancia. Aún así, el JIT puede elegir alinear estos métodos cuando ve que no son virtuales. – Steven

1

El costo de rendimiento es tan insignificante que es irrelevante en comparación con hacer que el código sea fácil de leer y su intención clara.

+2

En general, puede optimizar para un subconjunto de {velocidad, memoria, confiabilidad, eficiencia del programador}. Descubrí que si optimizas la eficiencia del programador primero, los demás son bastante fáciles de hacer después. Cualquier otro pedido no funciona tan bien. –

+0

No podría estar más de acuerdo. Si la intención del código es fácil de comprender por otros programadores, entonces se pueden encontrar eficiencias de rendimiento más adelante con un costo de recursos más bajo. – Thomas

6

Hay un cost asociado con llamadas a métodos;

Los argumentos deben colocarse en la pila o almacenarse en registros, deben ejecutarse el método prolog y epilog, y así sucesivamente. El costo de estas llamadas se puede evitar por In-lining.

Pero, JIT usa una cantidad de heurísticas para decidir si un método debe alinearse. Los siguientes factores influyen en JIT, no en un método en línea.

  • Métodos que son mayores que 32 bytes de IL
  • funciones virtuales
  • métodos que tienen complejo flujo de control
  • Métodos que contienen bloques de manejo de excepciones
  • Si cualquiera de los métodos de Los argumentos formales son estructuras

Referencia: Method Inlining

Cuestiones relacionadas