¿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
Respuesta
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.
en el caso de C# 2do punto es cuestionable. CSC emite 'callvirt' para cada método call – Andrey
@Andrey: Usar' callvirt' en métodos no virtuales no impide que el JIT integre ese método. – Steven
@Steven No dije que impida la alineación. Acabo de decir que virtual o no no afecta a la instrucción emitida – Andrey
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.
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.
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
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.
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. –
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
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
- 1. ¿Qué tan caras son las llamadas a funciones en JavaScript?
- 2. ¿Por qué son tan caras las claves de firma?
- 3. ¿Qué tan seguros son los recursos en .NET?
- 4. ¿Cómo encuentro las llamadas a los métodos?
- 5. ¿Qué son las llamadas en java?
- 6. ¿por qué las llamadas a funciones en bucles Perl son tan lentas?
- 7. ¿Qué operaciones son baratas/caras en mongodb?
- 8. ¿Por qué los iframes son tan lentos?
- 9. ¿Qué tan estables son las máquinas ec2?
- 10. ¿Qué tan costosos son los eventos MySQL?
- 11. ¿Qué son los métodos virtuales?
- 12. ¿Las llamadas a los métodos de Javascript son seguras o sincronizadas?
- 13. ¿Qué son los métodos de extensión?
- 14. Cómo gestiona CLR las llamadas a métodos externos en C#
- 15. ¿Qué son las convenciones de llamadas personalizadas?
- 16. ¿Por qué los vectores son tan superficiales?
- 17. ¿Qué son los métodos anónimos en C#?
- 18. ¿Qué son los registros de llamadas y de llamadas guardadas?
- 19. Ser notificado de llamadas a métodos en .NET
- 20. ¿Qué son realmente las cadenas en .NET?
- 21. ¿Cuáles son los métodos para tokenizar cadenas en .Net?
- 22. ¿Por qué los arrays de arrays (vectores) son tan lentos?
- 23. ¿Qué tan seguras son las claves de acceso Amazon AWS?
- 24. ¿Por qué las consultas WMI son tan lentas algunas veces?
- 25. ¿Qué son los metadatos en .NET?
- 26. ¿Qué tan bien resuelve el diccionario .NET las colisiones?
- 27. ¿Por qué las llamadas C# son diferentes para métodos sobrecargados para diferentes valores del mismo tipo?
- 28. Python: envolver las llamadas a métodos con los métodos de pre y post
- 29. ¿Qué tan populares son las revisiones del código de seguridad?
- 30. ¿Cómo ignorar las llamadas a métodos inesperados en JUnit/easymock?
¿Qué estás desarrollando por lo que estás tan preocupado por la llamada al método que consume mucho tiempo? –
Un gran almacén de datos en memoria – Andrew
¿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. –