java - estructura - que es un compilador
¿Ganancia de rendimiento en la compilación de Java al código nativo? (5)
¿Hay algún rendimiento que se obtenga estos días desde la compilación de Java hasta el código nativo, o los compiladores de punto de acceso moderno terminan haciendo esto con el tiempo de todos modos?
¿Rendimiento de la memoria o rendimiento de la CPU? ¿O son los mismos en estos días?
Mi única evidencia es anecdótica y en una plataforma diferente: después de portar un montón de aplicaciones de CPU a C # (.NET 2.0), no noté una pérdida sustancial en el rendimiento (no considero un 10% sustancial). El código bien escrito parece funcionar bien en una variedad de arquitecturas.
La mayoría de las aplicaciones gastan / pierden tiempo con:
- Operaciones IO que no se beneficiarán del análisis estático (tiempo de compilación).
- Mal algoritmos que no se beneficiarán del análisis estático.
- Malos diseños de memoria en los circuitos internos críticos de la CPU. Si bien es técnicamente posible que los compiladores nos ayuden aquí, aún no he visto que un compilador real haga algo interesante.
Por lo tanto, según mi experiencia, a menos que esté escribiendo un códec de video, no es beneficioso compilar aplicaciones Java, sino solo confiar en los compiladores de puntos de acceso.
Alguna evidencia más anecdótica. He trabajado en algunas aplicaciones financieras comerciales de rendimiento en tiempo crítico. Estoy de acuerdo con Frank, casi siempre que tu problema no es la falta de compilación, es tu algoritmo o estructura de datos. Los compiladores de puntos calientes modernos son muy buenos con el código correcto, por ejemplo, la biblioteca CERN Colt está dentro del 90% del Fortran compilado y optimizado para el trabajo numérico.
Si te preocupa la velocidad, realmente te recomendaría un buen generador de perfiles y obtendrás pruebas de dónde están tus cuellos de botella: utilizo YourKit y estoy muy satisfecho.
Solo hemos recurrido al código compilado nativo para la velocidad en una instancia en los últimos años, y eso fue para poder usar CUDA y obtener un rendimiento serio de la GPU.
Su pregunta es un poco grande, la respuesta varía mucho
- Si usa la compilación Just In Time (JIT) o no
- Cuando está usando ,, si su proceso se ejecuta durante un tiempo prolongado o no
Todas las JVM recientes usan JIT, pero en la antigua JVM, el código Java es varias veces más lento que el código nativo.
Si tiene un servidor que se ejecuta durante un período largo de tiempo o un lote que ejecute el mismo código una y otra vez, la diferencia y el aumento serán muy bajos.
Escribimos el mismo lote tanto en C ++ como en Java y lo ejecutamos con un conjunto de datos diferente, el resultado difiere durante aproximadamente 3 segundos, y el conjunto de datos tarda de 5 minutos a varias horas.
Pero tenga cuidado, son un caso especial de que habrá una diferencia importante, por ejemplo, el lote que necesita mucha memoria.
Intenté con Hello-World con seis implementaciones diferentes solo para verificar la sobrecarga y la diferencia fue asombrosa. Java estaba fuera de lo normal, mientras que los lenguajes compilados funcionaban igual de bien. Podría probar todas las pruebas (de forma reproducible) si fuera necesario.
Hubo una discusión similar aquí recientemente, para la pregunta ¿Cuáles son las ventajas de bytecode sobre el código nativo? . Puedes encontrar respuestas interesantes en ese hilo.