Fast Site Engine

Высокопроизводительная CMS для сайтов.

Сделать сайт

Карта сайта
Переходим на Линукс
Политика конфиденциальности
Сделать сайт на основе Fast Site Engine

Установка
Документация
Список изменений
Лицензионное соглашение

Скачать
О движкеПроизводительностьБезопасностьТехнические требованияSEOКонтакты

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)
вызововвремя f1()время 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)
вызововвремя f1()время 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)
вызововвремя f1()время 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)
вызововвремя f1()время 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..



© Все права защищены 2004 - 2024