Muchas veces he visto varios puntos de referencia que muestran cómo funcionan varios idiomas en una tarea determinada.
Estos puntos de referencia siempre revelan que Python es más lento que Java y más rápido que PHP, y me pregunto por qué ese es el caso.
- Java, Python y PHP se ejecutan dentro de una máquina virtual
- Los tres idiomas convierten sus programas en sus códigos de bytes personalizados que se ejecutan en la parte superior del sistema operativo, por lo que ninguno se ejecuta de forma nativa
- Tanto Java como Python se pueden "compilar" (
.pyc
para Python) pero el__main__
módulo para Python no está compilado
Python y PHP se escriben dinámicamente, y Java estáticamente, esta es la razón por la que Java es más rápido, y si es así, explique cómo afecta eso a la velocidad.
E, incluso si el argumento dinámico vs estático es correcto, esto no explica por qué PHP es más lento que Python, porque ambos son lenguajes dinámicos.
Puedes ver algunos puntos de referencia aquí y aquí , y aquí
java
php
python
language-design
codificador de árboles
fuente
fuente
Respuestas:
El código JVM puede compilarse JIT de manera eficiente, utilizando un compilador ad hoc trivial (y rápido). Pero lo mismo sería excepcionalmente difícil para PHP y Python, debido a su naturaleza de tipo dinámico. JVM se traduce en un código nativo directo y de nivel bastante bajo, bastante similar a lo que produciría un compilador de C ++, pero para los lenguajes dinámicos tendría que generar un despacho dinámico para literalmente todas las operaciones básicas y para todas las llamadas a métodos. Este despacho dinámico es el principal cuello de botella para todos los idiomas de este tipo.
En algunos casos, es posible eliminar el despacho dinámico (así como las llamadas virtuales en Java) utilizando un compilador JIT de rastreo mucho más complicado. Este enfoque todavía está en pañales, no hace demasiada interpretación abstracta, y es probable que dicho compilador se atragante con las
eval
llamadas (que son muy típicas para los lenguajes dinámicos).En cuanto a la diferencia entre Python y PHP, este último es de una calidad mucho menor. Podría correr más rápido en teoría, pero nunca lo hará.
fuente
eval
llamadas.Hay un problema general con esta pregunta porque es demasiado absoluta. Realmente no tiene sentido decir "el lenguaje X es más rápido que el lenguaje Y". Un lenguaje de computadora en sí mismo no es "rápido" o "lento" porque es simplemente una forma de expresar un algoritmo. La pregunta real debería ser algo del orden de "¿por qué la implementación X1 del lenguaje X es más rápida que la implementación Y1 del lenguaje Y para este dominio problemático en particular?"
Ciertamente, algunas diferencias de velocidad caerán del lenguaje en sí ya que ciertos idiomas son más fáciles de implementar ciertos dominios que otros. Pero gran parte de lo que hace que una implementación sea rápida no es el lenguaje. Por ejemplo, no se puede decir "Python es más lento que Java" sin considerar si se trata de CPython, IronPython o PyPy. Esto es particularmente cierto para los lenguajes que usan una VM, ya que la velocidad se verá directamente afectada por la calidad de la VM.
Por otro lado, trabajo con un sistema que por varias razones no puede usar JIT en nuestro dispositivo con una máquina virtual JavaScript muy popular que normalmente lo admite. Esto significa que nuestro JavaScript funciona mucho, mucho más lento que en una PC con un procesador similar. Ese cambio, que no está directamente relacionado con el lenguaje en sí, lleva a JavaScript de ser "unas veces más lento que C ++" a ser "órdenes de magnitud más lentos que C ++" para las tareas que nos interesan.
También tenga en cuenta que los idiomas difieren en las características de rendimiento en formas que no son directamente comparables. Demasiados puntos de referencia simplemente traducen un programa del idioma A al idioma B y no tienen en cuenta que los idiomas difieren en qué funciones son rápidas. (Puede ver esto en cualquier comparación de referencia razonable, como las que vincula, ya que a menudo tienen notas como "gracias a tal y tal por mostrarme cómo implementarlo en lenguaje Foo").
Por ejemplo, tome este código Java:
Sería tentador "reescribir" esto en C ++ y comparar los tiempos de ejecución:
La cuestión es que cualquier programador competente de C ++ verá de inmediato que en C ++, esta no es la forma más rápida de hacer algo. Puede acelerar las cosas fácilmente cambiándolo para que sea más apropiado para C ++:
El punto no es que C ++ pueda ser rápido, sino que escribir puntos de referencia para comparar lenguajes es realmente difícil. Para hacerlo adecuadamente, debes ser un experto en ambos idiomas y escribir desde cero en ambos idiomas. Incluso entonces, puede encontrar fácilmente áreas donde un idioma sobresale en una tarea en particular. Por ejemplo, puedo escribir una versión de Towers of Hanoi en C ++ que se ejecutará más rápido que Java en cualquier compilador razonable. Puedo hacer eso esencialmente haciendo trampa, usando plantillas de C ++, evaluadas en tiempo de compilación (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)
El punto no es que podría decir que "C ++ es más rápido que Java" porque mi programa regresó instantáneamente mientras la versión de Java se ejecutó durante minutos (y esperando que nadie se diera cuenta de que mi programa tardó media hora en construirse). El punto es que para esto varía caso estrecho, C ++ es más rápido. Para otros casos estrechos, podría ser al revés. Por lo tanto, no es "C ++ es más rápido", es "C ++ es más rápido en los casos en que puede evaluar la expresión en el momento de la compilación utilizando plantillas". Menos satisfactorio, pero cierto.
Las diferencias de velocidad en los idiomas se refieren principalmente a la implementación. Los idiomas compilados serán más rápidos que los idiomas interpretados. Compilar en código nativo será más rápido que compilar en código de bytes. Esto tendrá mucho más efecto que preguntas como si el idioma está estáticamente escrito o no. Y, por supuesto, las implementaciones buenas serán más rápidas que las malas.
Y no olvide que los buenos programadores producirán un código más rápido que los malos programadores, a menudo en una medida que supera con creces las diferencias de idioma.
fuente
Tiene que ver con la calidad del compilador, el compilador de Java se ha optimizado continuamente durante mucho más tiempo, y la optimización es más importante porque todo el código está compilado para Java. No estoy seguro de la razón exacta para que Python sea más rápido que PHP, pero apuesto a que es debido a la influencia de Google con Python.
fuente
Por qué Java es el más rápido:
Tipo estático + compilación JIT + - bandera del servidor para recompilar agresivamente el código en ejecución.
Por qué Python es más rápido que PHP:
Python puede ser un lenguaje dinámico, pero todavía está fuertemente tipado. Esto significa que las estructuras que codifica son capaces de optimizar el tiempo de ejecución.
Por qué PHP apesta:
Básicamente es javascript en el servidor (no es compatible con subprocesos múltiples, totalmente dinámico, tipeado libremente)
En esencia, cuanto más sepa el compilador sobre su código, más podrá optimizar. Java es completamente optimizable antes de ejecutarse y mientras se ejecuta. Python es optimizable mientras se está ejecutando, y PHP es, bueno, terrible. Facebook realmente transpila su PHP a C antes de que llegue al servidor.
https://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/
fuente
Los puntos de referencia están bastante sesgados a favor de la programación matemática pesada.
No es sorprendente que Python sea bastante bueno en matemáticas complejas si considera dónde y por qué se escribió por primera vez .
PHP, por otro lado, fue escrito para servir páginas web, puede hacer otras cosas, pero las páginas web es lo mejor y está a la par o mejor que Java en esta tarea.
fuente