Estoy en el proceso de transferir un determinado algoritmo de procesamiento de datos de Java a C++. La razón para volver a escribir el código es la portabilidad, necesita ejecutarse en entornos donde Java no está disponible. Sin embargo, como beneficio adicional, se esperaba una mejora en el rendimiento.¿Qué tan caro es .getClass() en Java?
Básicamente, el algoritmo lee datos de un gráfico formado por objetos con punteros entre sí y luego calcula un resultado. Durante el cálculo, se realizan numerosas asignaciones de objetos, por lo que quizás esto sea responsable de la desaceleración. El caso es que el código C++ actualmente se ejecuta aproximadamente 10 veces más rápido que el código Java anterior. Esto fue realmente inesperado. Solo pensé que vería una mejora de tal vez 50-60%.
Lamentablemente, no estoy en libertad de publicar el código aquí para su análisis. Son varios miles de líneas, así que no estoy seguro de lo conveniente que sería de todos modos.
El problema es que el algoritmo es casi exactamente el mismo. La única gran diferencia que puedo pensar es que en Java hay muchas clases hijas de una sola superclase y si (object.getClass() == daughterx.class) se llama muchas veces durante el cálculo, mientras que en el código C++ solo una general se usa la clase (ya que hay pocas diferencias de código entre las clases hijas) y se usa una comparación de números enteros simples, por ejemplo. if (object-> type == 15)
¿Qué tan caro es el método Object.getClass() en Java? ¿Qué está sucediendo exactamente en el nivel bajo cuando se invoca este método?
@ xlc0212 Tampoco lo son cualquiera de las otras personas que no entienden de Java ! ;) – cheeken
@cheeken depende de la JVM, sin JIT, recuerdo que leí en alguna parte que Java es incluso más lento que python –
Honestamente, esto no parece ser un problema. ¿Vale la pena dedicar tiempo a la evaluación comparativa y al perfil de su código obsoleto? A menos que haya hecho eso, no hay manera de saber que '.getClass()' es el cuello de botella. Adivinar no es una forma útil de depurar problemas de rendimiento, a menos que pueda reducir significativamente la complejidad general de un algoritmo (es decir, pasar de una operación N-cuadrado a una operación log-N), y su conjunto de datos es muy grande. –