PHP7: функции → опкоды

Как известно, в ПХП7 некоторые функции будут заменены на опкоды для ускорения работы. Вызов функции — дорогая операция в этом интерпретаторе, а опкоды — дёшевы. Я заглянул в исходные коды (см. функцию zend_try_compile_special_func, если интересно) и нашёл там список функций, которые заменяются в текущей версии «семёрки».

Это strlen, все функции is_* (is_float, is_string и прочие), defined, call_user_func_array, call_user_func и assert.

Комментарии 15

Степан Анчугов № 1
Ага, как раз вот только что написал пулл-реквест, заменяющий dirname(__FILE__) на __DIR__, сравнил опкоды и задумался о том, как в Ruby происходит подобный процесс оптимизации интерпретатора. Там происходят от версии к версии примерно подобные улучшения, которые сводят на нет эффекты микрооптимизаций.
Евгений Степанищев (bolknote.ru) автор № 2
Ого, полезно (правда, мы в коде всё это заменили уже), можно посмотреть на пуллреквест?
q № 5
А какие есть фундаментальные преграды для того, чтобы оптимизировать вызовы функций?
Евгений Степанищев (bolknote.ru) автор № 6
В PHP7 оптимизированы будут (есть RFC уже, за него проголосовали), но опкоды всё равно дешевле.
Владимир Фаршатов № 9
врядли. Но, кмк, это упущение и существенное.
И ещё: есть оптимизация опкода на предмет констаного не исполнения блока?
Пример: if( false ){ тут что-то было }, как вариант IF( MY_CONST ){ что-то делаем }
Во втором случае, значение константы известно (скажем глобал или константа класса), соответственно или then или else часть можно выкинуть как неисполняемую (если она есть), а вместе с ней и лишнее ветвление.
Евгений Степанищев автор № 12
Посмотрим что там будет уметь //JIT// в ПХП8, вероятно что-то такое он со временем научится делать.
Владимир Фаршатов № 11
И оттуда же ещё мысля: как понимаю, use .. подгружает класс (трейт) в код исполнения, но .. с учетом «неисполняемого кода» (выше пример) он может оказаться не нужным вовсе — загрузка «ленивая» (после проверки что надо в коде класса) или «жадная» (сразу как встретилось)?
Евгений Степанищев автор № 13
Так посмотрите самостоятельно — в каком момент вызывается автолоадер.