A partir de PHP 8 se incluyen dos nuevos modos de compilación Just-In-Time: Tracing JIT y Function JIT. Siendo el primero (Tracing JIT) la opción más prometedora hasta el momento, mostrando un rendimiento hasta 3 veces superior en pruebas benchmark sintéticas, y un rendimiento entre 1,5 y 2 veces superior en aplicaciones de ejecución prolongada, como WordPress.

Comparación de rendimiento entre PHP sin JIT y los nuevos motores JIT de PHP 8

Ventajas

Una de las ventajas más importantes de implementar compilación JIT en lenguajes de programación interpretados, tales como PHP, es que hace posible compilar y guardar fragmentos del código directamente como instrucciones del procesador, o código de máquina, dependiendo de su frecuencia de uso. Este acercamiento híbrido trae mejoras importantes en el rendimiento, ya que tener parte del código pre-compilado nos permite eliminar el tiempo adicional que de otra forma consumiría el compilador al re-procesar el código en cada nueva petición.

Activación

En PHP, JIT forma parte de la extensión OPcache, y por lo tanto, depende de esta para funcionar.

PHP 8+ incluye JIT por defecto, aunque desactivado. Afortunadamente, activarlo es muy sencillo y solo requiere realizar algunos cambios en nuestro archivo de configuración php.ini:

; Activando OPcache

opcache.enable=1
; Activa la extensión OPcache para PHP base

opcache.enable_cli=1
;Activa la extensión OPcache para PHP CLI


; Activando el motor JIT

opcache.jit_buffer_size=256M
; Activa el compilador JIT y establece el tamaño del buffer

Aplicando configuración adicional

Aunque PHP ya cuenta con una configuración por defecto que debería cubrir muchos casos de uso, también podemos controlar mejor el comportamiento del motor JIT de manera más granular añadiendo la opción opcache.jit en nuestro archivo php.ini. Esta opción acepta los valores disable, off, on, tracing, function, y un valor de 4 dígitos (en orden CRTO) en el que cada dígito corresponde a un flag en específico, que iremos desglosando a continuación:

Configuración básica

  • disable desactiva por completo el motor JIT, sin posibilidad de habilitarlo en tiempo de ejecución
  • off desactiva el motor JIT, pero permite activarlo durante tiempo de ejecución
  • on activa el modo tracing
  • tracing un alias de los flags 1254
  • function un alias de los flags 1205
; Ejemplo de configuración básica
opcache.jit = on

Configuración avanzada

Flags de cuatro dígitos con orden CRTO

CRTO: CPU optimization, Registrer allocation, Trigger, Optimization

C (Optimización por CPU)

  • 0 Desactiva la optimización por CPU
  • 1 Activa optimización AVX si esta es soportada por el CPU

R (Asignación de registros)

  • 0 Desactiva la asignación de registro
  • 1 Realiza asignación de registro por bloque
  • 2 Realiza asignación de registro globalmente

T (Desencadenador)

  • 0 Compila todas las funciones al cargar el script
  • 1 Compila todas las funciones a la primera ejecución
  • 2 Perfila la primera petición y compila las funciones más usadas después
  • 3 Perfila en tiempo real y compila las funciones más usadas
  • 4 Utiliza JIT en modo Tracing, perfila en tiempo real y compila trazas de los segmentos de código más usados

O (Optimización)

  • 0 Sin JIT
  • 1 JIT mínimo (invoca handlers estandar del motor VM)
  • 2 Handlers inline del motor VM
  • 3 Usa inferencia de tipos
  • 4 Usa gráfico de llamadas
  • 5 Optimiza el script en su totalidad
; Ejemplo de configuración específica (CRTO)
opache.jit = 1254

Soporte

PHP 8 incluye soporte de compilación JIT en Linux y Windows con las las siguientes arquitecturas:

  • x86
  • x64
  • ARM64, AArch64 (JIT backend, PHP 8.1+)

Retrocompatibilidad

Este cambio no crea problemas de retrocompatibilidad, PHP está diseñado para ignorar cualquier configuración no soportada en php.ini, por lo que versiones anteriores de PHP solo ignorarán cualquier directiva JIT que encuentren y deberían ejecturarse con normalidad.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Unión de Datos en PHP 8 Lección siguiente Atributos en PHP 8