Para acomodar las pruebas unitarias y las burlas, se ha convertido en una práctica común declarar métodos y propiedades como virtuales. ¿Hay un impacto en el rendimiento de declarar algo virtual como supuestamente no virtual?Impacto del rendimiento de los métodos virtuales
Respuesta
En general, la diferencia es que los métodos virtuales se llaman usando Callvirt Opcode, mientras que los métodos virtuales no usan un Call Opcode estándar. Los Opcodes de llamada son definitivamente más rápidos que Callvirt, pero nunca lo he encontrado lo suficientemente sustancial como para justificar tomar decisiones de diseño basadas en esto.
Premature optimization is the root of all evil.
IIRC, el compilador C# utilizará CallVirt para todos los métodos de instancia, independientemente de si son virtuales. De esta forma, el CLR realiza la verificación de nulidad. –
@JohnSkeet ¿Significa eso que al final del día realmente no hay diferencia? – TGH
Buen punto John - tienes razón, a excepción de los métodos de instancia de tipo de valor, creo, para los cuales el compilador emite un Opcodes.Call. – Jeff
No, en realidad no.
No es algo que va a notar.
No sé los detalles, pero sí sé que usted no tiene que preocuparse de que el 99% de las aplicaciones por ahí.
btw - Si elige simular interfaces en lugar de clases, no necesitará métodos virtuales.
Buena suerte, Tom
Tiene la misma 'penalización' indirecta con una interfaz como método virtual. – leppie
- 1. ¿Los métodos abstractos son virtuales?
- 2. Impacto del rendimiento de la herencia virtual
- 3. ¿Qué son los métodos virtuales?
- 4. Tablas de métodos virtuales
- 5. ¿Los métodos que implementan métodos virtuales puros de una clase de interfaz deben declararse también virtuales?
- 6. ¿Cómo funcionan los métodos virtuales en C#?
- 7. Impacto en el rendimiento del cambio a interfaces genéricas
- 8. Anulación de métodos virtuales calificados
- 9. ¿Impacto de hyperthreading en el rendimiento del compilador?
- 10. Impacto de rendimiento de -fno-strict-aliasing
- 11. métodos no virtuales Sustitución
- 12. métodos virtuales puros C++
- 13. Java - Métodos virtuales
- 14. ¿Minimiza el rendimiento de impacto de Node.js?
- 15. Comparación: métodos de interfaz vs métodos virtuales vs métodos abstractos
- 16. Log.d e impacto en el rendimiento
- 17. Funciones virtuales y rendimiento C++
- 18. Métodos no virtuales en Java
- 19. convención de nombres para los métodos no virtuales y abstractas
- 20. ¿Cuál es el impacto en el rendimiento de los Contadores de rendimiento
- 21. ¿Métodos virtuales puros en C#?
- 22. C++ - ¿Uso excesivo de métodos virtuales?
- 23. resolución de sobrecarga de métodos virtuales
- 24. ¿Cuáles son las implicaciones de rendimiento de marcar métodos/propiedades como virtuales?
- 25. ¿Cómo burlarse de métodos no virtuales?
- 26. ¿Todos los métodos en Java son implícitamente virtuales?
- 27. ¿Por qué los métodos virtuales deben anularse explícitamente en C#?
- 28. Métodos o eventos virtuales en C#
- 29. falso/simulacro de métodos no virtuales C++
- 30. métodos virtuales y clases de plantilla
¿Crees _Diseño para testability_ es sólo hacer todo lo virtual' '' todas las clases y open'? Hmm ... –
@StefanHanke: No veo nada que sugiera que el OP piense que es * solo * eso. –
Sí, no creo que deba hacerse cuando no sea necesario ... Es solo una medida que puede mejorar la capacidad de prueba cuando sea apropiado – TGH