2012-09-20 1 views
9

Duplicar posible:
Why are interface method invocations slower than concrete invocations?¿Cuál es la clase o Interfaz rápida, abstracta?

Recientemente tuve la oportunidad de aparecer en una entrevista en la que entrevistador le preguntó cuál es el más rápido entre los clase abstracta y interfaz. Aunque me confundí con la pregunta, pero respondí Interfaz principalmente porque pensé que el concepto de enlace tardío puede causar un retraso en el rendimiento en la clase abstracta. Después de explorar esta misma pregunta en la web, llegué a saber que los métodos abstractos son más rápidos, aunque de acuerdo con algunos blogs Los métodos de interfaz son más rápidos. Estaba un poco confundido, así que pensé en hacer esta pregunta para tener una comprensión correcta de cuál es más rápido y por qué con una buena razón.

De acuerdo con lo siguiente, la clase de Resumen es rápida pero no hay una razón justificada para ello. http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface

Respuesta

9

La respuesta depende del lenguaje de programación y posiblemente del compilador que utilice. En entornos como Java VM donde se utilizan optimizaciones de tiempo de ejecución, probablemente no se pueda responder en absoluto. Y, sinceramente, en un proyecto Java típico, a nadie le importa porque incluso si hubiera una diferencia, sería tan pequeño que no ralentizaría notablemente su software. A menos que tengas estrictas restricciones en tiempo real, en cuyo caso no usarías Java (y posiblemente ningún polimorfismo en absoluto).

Básicamente, tanto los métodos de interfaz como los métodos abstractos utilizan el despacho dinámico, por lo que la diferencia es mínima si la hay. Sin mucho conocimiento de los detalles, asumiría que, en teoría, los métodos abstractos se despachan más rápido siempre que el lenguaje no implemente herencia múltiple para las clases. La posición del puntero de método en el vector de envío sería estática, mientras que no es para métodos de interfaz (una clase puede implementar típicamente múltiples interfaces).

Pero como he dicho, no conozco los detalles sobre lo que sucede en el compilador. Puede haber otros factores en los que no pensé. Si tuviera que responder esta pregunta en una entrevista, citaría la "optimización prematura de Don Knuth es la raíz de todo mal".

0

La mejor respuesta a esa pregunta es "Escribiría una pequeña prueba para averiguar, si realmente, realmente necesitaba". Obtenga un ejemplo real y ejecútelo, en condiciones controladas, con dos implementaciones que varían solo en la interfaz frente a la clase abstracta. Sin una implementación concreta, las preguntas "qué es más rápido" tienen poco sentido. O bien el entrevistador estaba tratando de presumir (y probablemente ignorante de la respuesta real), tratando de poner a prueba sus habilidades de pensamiento crítico (¿tiene sentido esta pregunta?), O extremadamente quisquilloso.

La primera regla de optimización es no optimize ... yet. La segunda regla es perfilar su programa para encontrar los cuellos de botella antes de cualquier refactorización: un cambio de algoritmo o de estructura de datos, el lugar correcto suele ser lo único que se necesita; y estoy dispuesto a apostar que, por ejemplo, en Java, el compilador del punto de acceso hará cualquier diferencia entre el resumen y la interfaz, si es que hay alguna, realmente difícil de encontrar.

+0

muy tentado de repetir la primera regla dos veces, como en todas las citas de "la primera regla de Fight Club" ... – tucuxi

+1

Un problema con esa filosofía es que no revelará si los factores del mundo real pueden causar una general- enfoque superior para a veces realizar mucho peor que uno generalmente inferior.Por ejemplo, dada la elección entre dos fragmentos de código, uno de los cuales requiere un par de cuatro accesos vtable y uno de los cuales requiere asignar 32 bytes adicionales de basura, es posible que el que genera más basura sea generalmente más rápido, pero podría terminan siendo mucho más lentos si hay una gran cantidad de basura gen2 que se toca entre los ciclos de recopilación gen0. – supercat

+0

mi punto es que optimizar las manos en todas partes es un uso mucho más pobre de su tiempo que optimizar * solo donde realmente cuenta *. Primero, busca lo que está caliente y optimiza * eso *. De lo contrario, estás perdiendo tiempo y esfuerzo. – tucuxi

Cuestiones relacionadas