Php 8.0: Mas Rápido Que Nunca con el Compilador Jit

Con el lanzamiento de la versión 8, PHP también vendrá con soporte de compilación Just-in-Time. Aumentaremos la velocidad de ejecución lanzando aplicaciones ya compiladas.

by Luigi Nori Date: 15-04-2020 php php8 php7 jit assembly 3d


Probablemente ya habéis oido la noticia hace unos meses de que el compilador JIT será agregado a PHP 8. Ya desde PHP 7.0, se han hecho cambios para mejorar el rendimiento, pero esto será un nuevo avance para PHP. Esta gran característica fue desarrollada hace 2 años, pero el lanzamiento de PHP 8.0 se espera en menos de 1 año. En este artículo, echaremos un vistazo a lo que realmente se trata, pero lo más importante es que intentaremos probarlo en Linux.

Que es JIT

Tal vez no conozcas al JIT, así que te explicaremos de qué se trata primero. Probablemente ya sabes que PHP es un lenguaje de scripts del lado del servidor, lo que significa que no necesitas compilar el código antes de que se ejecute (a diferencia de otros lenguajes como C/C++). En cambio, el módulo PHP lee el código y lo ejecuta. En otras palabras, no codificas el código para compilarlo en lenguaje de máquina para ejecutarlo, sino que codificas un script y luego lo envías a PHP para ser ejecutado en el lado del servidor con precisión.

PHP está equipado con una máquina virtual llamada Zend VM. ¿Por qué llamarla máquina virtual? Porque se comporta como un ordenador cuando ejecuta el código por sí mismo. Es responsable de leer y ejecutar el código PHP. Pero antes de eso, el código será leído y traducido de PHP a opcode, el lenguaje que Zend VM entiende. Entonces Zend VM será capaz de ejecutar ese código de operación. Esta es una ilustración para facilitar la comprensión.

Así que necesitamos un paso de "code parsing" primero y luego la interpretación. Lo aceleraremos, usando el llamado OPCache (Opcode Cache) que almacena los resultados de la fase de compilación, así que no será necesario volver a compilar la próxima vez. Así es como funcionaba PHP hasta ahora.

Así que ahora hablemos del compilador JIT, significa que compilaremos el código fuente en un lenguaje de máquina para ejecutarlo. JIT significa "Just-In-Time", lo que significa que llevará tiempo compilar, en lugar de primero compilar y luego ejecutar. Cuando necesites iniciar el guión, será compilado en el momento.

Para PHP, el compilador JIT compilará el código fuente en código de máquina y ejecutará ese código en lugar de enviarlo a Zend VM para ser ejecutado. Así que ya no necesitamos un intérprete y, por supuesto, el código funciona aún más rápido.

¿Será realmente más rápido?

Este es un demo que muestra la velocidad de PHP con el compilador JIT comparado con la versión antigua. En el vídeo se utiliza un código para crear imágenes 3D.

Pero, CUIDADO, nadie ha usado nunca antes el PHP para crear imágenes 3D!!!

Dado que nuestro escript será compilado en el código de la máquina y será ejecutado directamente por la CPU en lugar del intérprete server side, los aumentos de velocidad serán principalmente sobre el inicio del código en sí y el uso de la CPU (por lo que requiere la potencia de la máquina). Pero la aplicación Web no tiene tal código, todo será delegado por el proceso de I/O (query de base de datos, carga de files, solicitud HTTP, etc.), la mayoría de las veces la aplicación no hace nada, sólo escucha para mostrar los resultados de la base de datos o la API, etc. Desafortunadamente, ahora mismo es poco probable que una aplicación web sea más rápida.

¿Para qué es el JIT?

Desde la versión 7.0 de PHP, el problema de rendimiento ha sido uno de los grandes problemas a resolver, en parte debido a la competencia de HHVM de Facebook (que también utiliza el compilador JIT). OPCache, estructura los datos, optimizando todo poco a poco para obtener el máximo rendimiento.

Además, el rendimiento de PHP como lenguaje de servidor ya puede considerarse bastante bueno, y no será tan lento como en el pasado. Así que es hora de expandir las capacidades de PHP a áreas como análisis de datos, renderizado 3D/2D, etc.

En el pasado, el código de alto rendimiento se escribía a menudo como una extensión en C/C++ en lugar de un paquete PHP. Por ejemplo, phpredis es siempre 6-7 veces más rápido que predis. Si el código PHP es compilado en vez de interpretado, obtendrá paquetes con el mismo rendimiento que las extensiones escritas en C/C++.

Esta es la principal razón por la que se eligió el compilador de JIT: esta es la mejor y potencial dirección a seguir.

Testeamos en el servidor

Después de esta acertada introducción, probémoslo en el campo. Como todavía no hay una versión de PHP 8.0, tendremos que compilar a partir del código fuente de PHP versión 7.4, es decir, todavía en alfa, el master ya es 8.0. Primero, descarguemos el código fuente:

wget -O php.zip https://github.com/php/php-src/archive/master.zip unzip php.zip cd php-src-master

Así que instalamos adicciones. Usaremos Ubuntu Server, si usas otras distribuciones encontrarás el mismo paquete por ti mismo.

apt-get install autoconf bison dpkg-dev file g++ gcc libc-dev make pkg-config re2c libxml2-dev libsqlite3-dev

Generamos el file de build ./buildconf;

Entonces ejecutas ./configure para configurar la construcción. Selecciona las opciones para compilar PHP. Puedes elegir una ruta de instalación añadiendo -prefix = <dir_install> . Por defecto instalará /usr/local/bin , así que si ya tienes otra versión instalada, recuerda configurarlo. PHP se instalará en la ruta <dir_install>/bin/php . Añade la ruta al archivo de configuración con -with-config-file-path y -with-config-file-scan-dir si lo deseas.

./configure --help 

Por ejemplo ejecutamos ./configure come sigue:

./configure --prefix=/opt --with-config-file-path=/opt/php –with-config-file-scan-dir=/opt/php/conf.d

Montamos

make -j$(nproc)
make install

Así que comprobamos ejecutando :

php -v

desde shell debería sacar:

PHP 8.0.0-dev (cli) (built: Jul 15 2019 02:22:59) ( NTS ) 
Copyright (c) The PHP Group Zend Engine v4.0.0-dev, 
opyright (c) Zend Technologies     
with Zend OPcache v8.0.0-dev, Copyright (c), by Zend Technologies

El compilador JIT es parte de la extensión OPCache, así que habilitémoslo antes de usarlo. Añadamos estas líneas a fichero php.ini:

opcache.jit_buffer_size=32M
opcache.jit=1235

Ahora intentaremos ejecutar un archivo PHP con la opción

-dopcache.jit_debug = 1

Veremos el código assembly compilado. Por ejemplo, con un archivo como este:

<?php
$a = 0;
for ($i = 0; $i < 10000; $i++) {
$a += $i;
}
echo $a;

Será compilado en el código assembly de la siguiente manera:

JIT$/php-src-master/hello.php: ; (/php-src-master/hello.php)
sub $0x10, %rsp
lea 0x50(%r14), %rdi
cmp $0xa, 0x8(%rdi)
jnz .L1
mov (%rdi), %rdi
cmp $0x0, 0x18(%rdi)
jnz .L12
add $0x8, %rdi
.L1:
test $0x1, 0x9(%rdi)
jnz .L13
.L2:
mov $0x0, (%rdi)
mov $0x4, 0x8(%rdi)
; ...

Ahora probemos el punto de referencia para ver si realmente es más rápido. En el código fuente, hay un archivo Zend/bench.php que podemos probar. En este archivo hay muchos códigos calculados (hash, loop .etc). Este es el resultado (reformateado para facilitar la comparación):

Seguramente es más rápido, no es nada raro. Intentaremos comparar otra aplicación web, un proyecto Laravel y compararlo con la herramienta ApacheBench

ab -t10 -c10 http://test.localhost/

Este es el resultado:

PHP 7.3: 131.37 req/s
PHP 8.0 + JIT: 133.57 req/s

En resumen, a partir de la versión 8 será significativamente más rápido, pero por el momento, la mayor parte del código PHP existente en el mundo mantendrá los estándares que todavía son aproximadamente lentos. Sin embargo, se abrirán nuevos desarrollos para la nueva versión de PHP compilada por JIT.

Si necesita aclaración sobre cómo configurar correctamente un servidor web con php puede seguir nuestras guías

 
by Luigi Nori Date: 15-04-2020 php php8 php7 jit assembly 3d visitas : 1619  
 
Luigi Nori

Luigi Nori

He has been working on the Internet since 1994 (practically a mummy), specializing in Web technologies makes his customers happy by juggling large scale and high availability applications, php and js frameworks, web design, data exchange, security, e-commerce, database and server administration, ethical hacking. He happily lives with @salvietta150x40, in his (little) free time he tries to tame a little wild dwarf with a passion for stars.

 
 
 

Artículos relacionados