Fast Site Engine
Высокопроизводительный движок для сайтов
Заказать сайт на основе движка
О движкеПроизводительностьБезопасностьТехнические требованияSEO 
Лицензионное соглашение
Демо
Установка
Панель управления
Модули
Документация
Шаблоны
Тесты производительности php
Планы на будущее
Список изменений
Отзывы и пожелания
Переходим на Линукс
Всякое разное
Тесты производительности php  »  isset vs ??

isset vs ??

В php7 стал доступен новый Null коалесцентный оператор ?? (Null coalescing operator - оператор объединения со значением null). Он возвращает левый операнд, если он не имеет значение null, или возвращается правый операнд. Так же возможны цепочки из нескольких значений.. Оператор очень интересный, давайте выяснять что быстрее isset vs ?? на типичных операциях. Сравнение с empty() vs isset() vs is_null() не делаю, поскольку знаю что isset быстрее, тесты можно в интернете найти.

Проверяем существование локальной переменной или глобальной

Результат этого теста, с объявлением глобально или нет, примерно одинаковы и показывают преимущество коалесцентного оператора. ($ix не задан..)

function f1(){
  global $ix;
  $i=0;$x=0;while(++$i<LOOP)$x=isset($ix)?$ix:$i;
}
function f2(){
  global $ix;
  $i=0;$x=0;while(++$i<LOOP)$x=$ix??$i;
}
Компьютер: (php 7.1.4)
вызововвpемя f1()вpемя f2()выигралбыстрее на
11 000 0000.0261120.023609f2()0.002503 с.9.59 %
21 000 0000.0259660.023624f2()0.002342 с.9.02 %
31 000 0000.0259750.023551f2()0.002424 с.9.33 %
41 000 0000.0337290.024999f2()0.008730 с.25.88 %
51 000 0000.0269140.025144f2()0.001770 с.6.58 %
61 000 0000.0301700.027798f2()0.002372 с.7.86 %
71 000 0000.0259350.023677f2()0.002258 с.8.71 %
81 000 0000.0260530.023748f2()0.002305 с.8.85 %
91 000 0000.0260080.023705f2()0.002303 с.8.86 %
Всего: 9 000 0000.2468620.219854f2()0.027008 с.10.94 %
Сервер: (php 7.2.0 RC 1)
вызововвpемя f1()вpемя f2()выигралбыстрее на
11 000 0000.0241040.019627f2()0.004477 с.18.57 %
21 000 0000.0238600.019524f2()0.004336 с.18.17 %
31 000 0000.0225080.019057f2()0.003451 с.15.33 %
41 000 0000.0217600.019374f2()0.002386 с.10.96 %
51 000 0000.0227380.019160f2()0.003578 с.15.74 %
61 000 0000.0222330.019661f2()0.002572 с.11.57 %
71 000 0000.0301330.019057f2()0.011076 с.36.76 %
81 000 0000.0229090.020196f2()0.002713 с.11.84 %
91 000 0000.0216340.018775f2()0.002859 с.13.22 %
Всего: 9 000 0000.2118790.174431f2()0.037448 с.17.67 %

Проверяем существование переменной в глобальном массиве GET

Эта задача типичная и представляет наибольший интерес. Также объявлял дополнительно массив $ix, $_GET и заполнял значениями - все разы isset побеждал примерно в том же соотношении что и в таблицах тестов ниже.

function f1(){
  $i=0;$x=0;while(++$i<LOOP)$x=isset($_GET['ix'])?$_GET['ix']:$i;
}
function f2(){
  $i=0;$x=0;while(++$i<LOOP)$x=$_GET['ix']??$i;
}
Компьютер: (php 7.1.4)
вызововвpемя f1()вpемя f2()выигралбыстрее на
11 000 0000.0414060.044314f1()0.002908 с.6.56 %
21 000 0000.0414430.044357f1()0.002914 с.6.57 %
31 000 0000.0429320.045673f1()0.002741 с.6 %
41 000 0000.0417580.044367f1()0.002609 с.5.88 %
51 000 0000.0412600.045830f1()0.004570 с.9.97 %
61 000 0000.0417340.045450f1()0.003716 с.8.18 %
71 000 0000.0410630.044287f1()0.003224 с.7.28 %
81 000 0000.0426660.045457f1()0.002791 с.6.14 %
91 000 0000.0425630.045062f1()0.002499 с.5.55 %
Всего: 9 000 0000.3768250.404798f1()0.027973 с.6.91 %
Сервер: (php 7.2.0 RC 1)
вызововвpемя f1()вpемя f2()выигралбыстрее на
11 000 0000.0342180.038240f1()0.004022 с.10.52 %
21 000 0000.0340750.038606f1()0.004531 с.11.74 %
31 000 0000.0337680.038209f1()0.004441 с.11.62 %
41 000 0000.0344940.038290f1()0.003796 с.9.91 %
51 000 0000.0343880.038023f1()0.003635 с.9.56 %
61 000 0000.0340160.038039f1()0.004023 с.10.58 %
71 000 0000.0337420.038750f1()0.005008 с.12.92 %
81 000 0000.0350880.039027f1()0.003939 с.10.09 %
91 000 0000.0334060.038658f1()0.005252 с.13.59 %
Всего: 9 000 0000.3071950.345842f1()0.038647 с.11.17 %

Эпилог

Удивительно, результат противоположен типичному поведению компилятора - текста больше, но исполнение isset всё равно быстрее с массивами. С коалесцентным оператором явно набыдлокодили.. Есть смысл использовать для локальных переменных, но вот с типичной задачей проверки данных в массиве GET или просто в массиве - нет, а это самая частая задача для подобных операторов..

Из данного теста и предыдущего php 7 строгая типизация получается: новые плюшки php7 не нужны, код можно оставить в состоянии версии php 5.4. Единственное радует, что php7 стал заметно производительнее и приближается к результатам с использованием файлового кэширования при помощи OPCache (компиляции в бинарники скриптов) на версиях php 5..

Страница сгенерирована за 0.004403 секунды
На один процесс веб-сервера: 227 стр/сек.
Всего Apache может отдать: 58 112 стр/сек.
Выделено php памяти: 872.41 KB, real_usage: 2 MB

© Все права защищены 2004 - 2018
Карта сайта
Отслеживать изменения в Твиттере
Политика конфиденциальности

Браузер построил за сек.
Полное время сек.

С момента выгрузки предыдущей страницы из памяти браузера: сек.