Jump to content
View in the app

A better way to browse. Learn more.

T.M.I IThub

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

PHP 8.3 JIT: я провёл месяц бенчмарков и вот что реально происходит

(0 reviews)

Когда PHP 8.0 вышел с JIT-компилятором, интернет взорвался. "PHP теперь БЫСТРЕЕ Python!" "JIT изменит всё!" "Переписывайте на PHP!". Заголовки были прекрасны. Реальность — немного иначе.

Я потратил месяц на бенчмарки JIT в нашем реальном highload-проекте на PHP 8.3 + CodeIgniter 4.6. Расскажу что нашёл. Без маркетинга, только цифры и контекст.


Немного теории (обещаю, коротко)

JIT (Just-In-Time compilation) — это компиляция горячего кода в нативные машинные инструкции во время выполнения. В отличие от OPcache, который кэширует opcode (байткод PHP), JIT генерирует настоящий машинный код.

PHP реализует два режима JIT:

  • Tracing JIT (jit=tracing) — анализирует трассы выполнения, оптимизирует горячие пути. Лучше для численных вычислений.

  • Function JIT (jit=function) — компилирует целые функции. Более предсказуемый, но менее агрессивный.

Конфигурация в php.ini:

[opcache]
opcache.enable=1
opcache.jit=tracing
opcache.jit_buffer_size=256M
opcache.jit_hot_loop=64
opcache.jit_hot_func=127
opcache.jit_hot_return=8
opcache.jit_hot_side_exit=8

Бенчмарк 1: Мандельброт (классика)

function mandelbrot(float $x0, float $y0): int
{
    $x = 0.0;
    $y = 0.0;
    $iteration = 0;
    $maxIteration = 1000;

    while ($x * $x + $y * $y <= 4.0 && $iteration < $maxIteration) {
        $xTemp = $x * $x - $y * $y + $x0;
        $y = 2.0 * $x * $y + $y0;
        $x = $xTemp;
        $iteration++;
    }

    return $iteration;
}

Результаты:

Конфигурация

Время

PHP 8.3, OPcache off

8.43s

PHP 8.3, OPcache on, JIT off

4.21s

PHP 8.3, OPcache on, JIT tracing

0.84s

PHP 8.3, OPcache on, JIT function

1.12s

JIT Tracing ускорил Мандельброт в 5 раз. Потрясающий результат! Но кто в вашем web-приложении считает Мандельброт?


Бенчмарк 2: Реальный CI4 request

Результаты на типичном API endpoint (среднее по 10,000 запросов):

Конфигурация

Среднее время

P99

OPcache on, JIT off

42.3ms

89ms

OPcache on, JIT tracing

41.8ms

87ms

OPcache on, JIT function

42.1ms

88ms

Разница: 1.2%. Это в пределах погрешности измерений.


Почему JIT не помогает веб-приложениям

Типичный PHP web-request проводит время примерно так:

  • ~45% — ожидание БД (I/O bound)

  • ~25% — сетевые операции (Redis, внешние API)

  • ~15% — OPcache-оптимизированный PHP-код

  • ~10% — сериализация/десериализация (JSON, etc.)

  • ~5% — собственно бизнес-логика с вычислениями

JIT помогает именно с CPU-bound вычислениями. Но в web-запросе CPU-bound части — это ~20% от общего времени. Максимальное теоретическое ускорение: 16%. На практике — 1-3%.


Правильная конфигурация для highload CI4

[opcache]
opcache.enable=1
opcache.enable_cli=0

opcache.memory_consumption=256
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0  ; В prod — ВСЕГДА 0
opcache.save_comments=1        ; CI4 использует атрибуты
opcache.preload=/var/www/app/preload.php
opcache.preload_user=www-data

opcache.jit=tracing
opcache.jit_buffer_size=128M
opcache.jit_hot_loop=64
opcache.jit_hot_func=127

И обязательно — preload для CI4:

<?php
// preload.php

$preloadClasses = [
    \App\Models\UserModel::class,
    \App\Models\ProductModel::class,
    \App\Libraries\Cache\ResilientCacheService::class,
    \App\Services\AuthService::class,
    // ... топ-50 самых используемых классов
];

foreach ($preloadClasses as $class) {
    if (class_exists($class)) {
        opcache_compile_file((new \ReflectionClass($class))->getFileName());
    }
}

С preload время ответа на первые запросы после деплоя сократилось с 200ms до 45ms. Это важнее JIT.


Итог: стоит ли включать JIT?

Включайте, если:

  • У вас PHP 8.1+ (в 8.0 JIT был сыроват)

  • Есть CPU-bound операции (обработка данных, вычисления)

  • Достаточно памяти для JIT buffer

Не ждите чудес, если:

  • Приложение I/O-bound (БД, Redis, внешние API)

  • Это стандартное CRUD web-приложение

  • Надеетесь что JIT заменит оптимизацию запросов

Прежде чем думать о JIT, убедитесь что правильно настроен OPcache, нет N+1 запросов, есть кэширование и нормальные индексы в БД. Это даст 10-100× ускорение. JIT — ещё 1-5% сверху. Но 5% при 10 миллионах запросов в сутки — тоже деньги. Поэтому включайте. Просто знайте зачем. 📊


0 Comments

Recommended Comments

There are no comments to display.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.