Ahora siéntese y lea el siguiente artículo que destruye mitos, vamos a aclarar cierta confusión sobre qué es el JIT, qué beneficiará y profundizará y en cómo funciona (pero solo un poco, porque no lo quiero aburrirlo).

Vamos a comenzar desde el principio con las preguntas simples y hasta las complejas, si ya sabes de que trata PHP 8 JIT, puedes saltarte esa parte …

¿Qué es el JIT?

PHP implementa una máquina virtual, una especie de procesador virtual, lo llamamos Zend VM. PHP compila su script legible por humanos en instrucciones que la máquina virtual comprende (los llamamos códigos de operación), esta etapa de ejecución es lo que llamamos “Tiempo de compilación”. En la etapa de ejecución “Runtime”, la máquina virtual (Zend VM) ejecuta las instrucciones de su código (códigos de operación).

Todo esto funciona muy bien, con herramientas como APC (en el pasado) y OPCache (hoy) que guardan en caché las instrucciones de su código (códigos de operación) para que el “Tiempo de compilación” solo ocurra cuando sea necesario.

Primero, una línea para explicar qué es JIT en general: Just-in-time es una estrategia de compilación que toma una representación intermedia de código y la convierte a código máquina dependiente de la arquitectura en tiempo de ejecución, justo a tiempo para la ejecución.

En PHP, esto significa que el JIT trata las instrucciones generadas para Zend VM como la representación intermedia y emite código de máquina dependiente de la arquitectura, de modo que el host de su código ya no es Zend VM, sino su CPU directamente.

¿Por qué PHP necesita un JIT?

El enfoque de la comunidad interna de PHP desde poco antes de PHP 7.0 ha sido el rendimiento, provocado por una sana competencia del proyecto HHVM de Facebook. La mayoría de los cambios principales en PHP 7.0 estaban contenidos en el parche PHPNG, que mejoró significativamente la forma en que PHP utiliza la memoria y la CPU en su núcleo, desde entonces cada uno de nosotros se ha visto obligado a vigilar el rendimiento.

Desde PHP 7.0 se han realizado algunas mejoras de rendimiento, optimizaciones para HashTable (una estructura de datos central para PHP), especializaciones en Zend VM para ciertos códigos de operación, especializaciones en el compilador para ciertas secuencias y un flujo constante de mejoras para el componente Optimizer de OPCache … y muchos otros además, demasiado aburrido para enumerar.

Es un hecho bruto que estas optimizaciones solo pueden llevarnos tan lejos y nos estamos acercando rápidamente, o tal vez ya nos hemos encontrado, a un muro de ladrillos en nuestra capacidad para mejorarlo aún más.

Advertencia: cuando decimos cosas como “no podemos mejorarlo más”, lo que realmente queremos decir es “las compensaciones que tendríamos que hacer para mejorarlo ya no parecen atractivas” … cada vez que hablamos sobre optimizaciones de rendimiento, estamos hablando de compensaciones. A menudo, compensa la simplicidad por el rendimiento. A todos nos gustaría pensar que el código más simple es el código más rápido, pero ese simplemente no es el caso en el mundo moderno de la programación en C. El código más rápido es a menudo ese código que está preparado para aprovechar los intrínsecos dependientes de la arquitectura o los componentes dependientes de la plataforma (compilador). La simplicidad simplemente no es garantía del mejor rendimiento …

En este momento, la capacidad de PHP a JIT parecería ser la mejor manera de exprimir más rendimiento de PHP.

¿El JIT hará que mi sitio web sea más rápido?

Con toda probabilidad, no significativamente.

Tal vez no sea la respuesta que esperaba: en el caso general, las aplicaciones escritas en PHP están vinculadas a E / S, y JIT funciona mejor en el código vinculado a la CPU.

¿Qué significa “E / S y CPU enlazado”?

Cuando queremos describir las características generales de rendimiento de un fragmento de código o una aplicación, utilizamos los términos enlazado de E / S y enlazado de CPU.

En los términos más simples posibles:

  • Un código de E / S enlazado iría más rápido si pudiéramos mejorar (reducir, optimizar) la E / S que está haciendo.
  • Un código enlazado a la CPU iría más rápido si pudiéramos mejorar (reducir, optimizar) las instrucciones que la CPU está ejecutando, o (mágicamente) aumentar la velocidad del reloj de la CPU 🙂

Una pieza de código, o una aplicación, puede estar vinculada a E / S, a CPU o igual a CPU y E / S.

En general, las aplicaciones PHP tienden a estar vinculadas a E / S; lo que las ralentiza es la E / S que realizan: conectarse, leer y escribir en bases de datos, cachés, archivos, sockets, etc.

¿Cómo se ve el PHP vinculado a la CPU?

El código enlazado a la CPU no es algo con lo que muchos programadores PHP estén familiarizados, debido a la naturaleza de la mayoría de las aplicaciones PHP: su trabajo tiende a conectarse a alguna base de datos, y posiblemente a un caché, hacer un poco de trabajo ligero y escupir un HTML / json / xml respuesta.

Puede mirar alrededor de su base de código y encontrar un montón de código que no tiene nada que ver con E / S, código que está llamando a funciones completamente desconectadas de E / S incluso, y confundirse porque parece estar implicando que esto no hace su aplicación está vinculada a la CPU, aunque puede haber muchas más líneas de código que tratan con no E / S que E / S.

PHP es en realidad bastante rápido, es uno de los lenguajes interpretados más rápido del mundo. No hay una diferencia notable entre la máquina virtual Zend que llama a una función que no tiene nada que ver con E / S y que realiza la misma llamada en el código de máquina. Claramente hay una diferencia, pero el hecho es que el código de máquina tiene una convención de llamada, y Zend VM tiene una convención de llamada, el código de máquina tiene un prólogo y Zend VM tiene un prólogo: ya sea que llame a some_c_level_function () en Zend Opcodes o código de máquina no hace una diferencia significativa en el rendimiento de la aplicación que realiza la llamada, aunque puede parecer una diferencia significativa en esa llamada.

Nota: Una convención de llamada es (aproximadamente) una secuencia de instrucciones ejecutadas * antes * de ingresar en otra función, un prólogo es una secuencia de instrucciones ejecutadas * en la entrada * en otra función: la convención de llamadas en ambos casos empuja los argumentos a la pila, y el prólogo los saca de la pila.

¿Qué pasa con los bucles, las llamadas de cola y X? Escucho que preguntas: PHP es realmente bastante inteligente, con el componente Optimizer de OPCache habilitado, tu código se transforma como por arte de magia en la forma más eficiente que podrías haber escrito.

Es importante tener en cuenta ahora que JIT no cambia la convención de llamada de Zend Functions de la convención establecida por la VM: Zend debe poder cambiar entre los modos JIT y VM en cualquier momento, por lo que se tomó la decisión de conservar la convención de llamada establecido por la VM. Como resultado, esas llamadas que ves en todas partes no son notablemente más rápidas cuando JIT’d.

Si desea ver cómo se ve el código PHP enlazado a la CPU, mire en el siguiente video. Este es obviamente un ejemplo extremo de código enlazado a la CPU, pero debería llevar a casa el punto en el que realmente brilla el JIT. área de las matemáticas.

¿PHP hizo la última compensación para acelerar las matemáticas?

No. Lo hicimos para ampliar el alcance de PHP, y considerablemente.

Sin querer tocar nuestro propio claxon, tenemos la web cubierta: si usted es un programador web en 2019 y no ha considerado usar PHP para su próximo proyecto, entonces está haciendo mal la web, en esta opinión muy sesgada del desarrollador de PHP .

Mejorar la capacidad de ejecutar las matemáticas más rápido en PHP parece, de un vistazo, tener un alcance muy limitado.

Sin embargo, esto de hecho abre la puerta a cosas como el aprendizaje automático, la representación 3D, la representación 2d (gui) y el análisis de datos, por nombrar solo algunos.

Deja un comentario

Tu dirección de correo electrónico no será publicada.

You May Also Like

PHP o Python cual es mejor para Web?

Estas preguntas no se pueden responder tan simplemente como un si o…

Pruebas E2E (testing) que son?

El sueño de todo desarrollador es que la aplicación de software que…

Lo que pienso de php 8 con respecto a otras versiones

PHP 7 fue increíble, ya que tenía muchas mejoras sobre PHP 5…