178 votos

El impacto en el rendimiento del uso de instanceof en Java

Estoy trabajando en una aplicación y un enfoque de diseño implica extremadamente pesadas, el uso del operador instanceof. Aunque sé que los OO de diseño generalmente se intenta evitar el uso de instanceof, que es una historia diferente y esta cuestión es puramente relacionadas con el rendimiento. Me preguntaba si hay algún impacto en el rendimiento? Es tan rápido como ==?

Por ejemplo, yo tengo una clase base con 10 subclases. En una única función que toma la base de la clase, yo no comprueba si la clase es una instancia de la subclase y llevar a cabo algunos de rutina.

Una de las otras maneras de pensamiento de la solución fue utilizar un "id de tipo" integer primitivo en su lugar, y el uso de una máscara de bits para representar las categorías de las subclases, y luego simplemente hacer un poco de máscara de comparación de las subclases "tipo de identificación" a un constante máscara que representa la categoría.

Es instanceof de alguna manera optimizada por la JVM al ser más rápido que? Quiero meter a Java, pero el rendimiento de la aplicación es fundamental. Sería genial si alguien que ha recorrido este camino antes de que pudiera ofrecer algunos consejos. Estoy molesto demasiado, o se centra en la cosa incorrecta a optimizar?

172voto

Steve Puntos 1491

Compiladores JVM/JIC modernos han eliminado el éxito del funcionamiento de la mayoría de las operaciones tradicionalmente "lentas", incluyendo instanceof, manejo de excepciones, reflexión, etc..

Como Donald Knuth escribió, "deberíamos olvidarnos de pequeñas eficiencias, decir alrededor del 97% del tiempo: la optimización prematura es la raíz de todo mal." El rendimiento de instanceof probablemente no será un problema, así que no pierdas tu tiempo subiendo con soluciones exóticas hasta que estés seguro de que ese es el problema.

17voto

Olaf Kock Puntos 18072

Respondiendo a tu última pregunta: a Menos que un analizador dice, que pases una cantidad ridícula de tiempo en un instanceof: Sí, eres una molestia.

Antes de preguntarse acerca de la optimización de algo que nunca se necesita ser optimizado: Escribir el algoritmo en la mayoría de lectura y ejecución. Ejecutar, hasta que el jit compiler obtiene una oportunidad para optimizar la misma. Si luego tienes problemas con este trozo de código, el uso de un analizador de decirle a usted, donde para obtener la mayoría y optimizar esto.

En tiempos de muy optimización de compiladores, sus conjeturas acerca de los cuellos de botella va a ser propensos a estar completamente equivocado.

Y en el verdadero espíritu de esta respuesta (que me wholeheartly creer): yo absolutamente no sé cómo instanceof y == relacionan una vez que el jit-compilador tiene una oportunidad para optimizarlo.

Se me olvidaba: Nunca mida la primera ejecución.

14voto

brianegge Puntos 12857

Los elementos que van a determinar el impacto en el rendimiento son:

  1. El número de clases posibles para que el operador instanceof podría devolver true
  2. La distribución de los datos - la mayoría de los instanceof operaciones resuelto en el primer o segundo intento? Se le quiere poner a su más probable devolver true operaciones de la primera.
  3. El entorno de implementación. Se ejecuta en un Sun Solaris VM es significativamente diferente a la del Sol Windows JVM. Solaris se ejecutará en 'server' el modo por defecto, mientras que Windows se ejecuta en modo cliente. El JIT optimizaciones en Solaris, hará todo el método de acceso capaz de la misma.

He creado un microbenchmark de cuatro tipos diferentes de métodos de envío. Los resultados de Solaris son como sigue, con el menor número de más rápido:

InstanceOf 3156
class== 2925 
OO 3083 
Id 3067

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X