Пишу, по большей части, про историю, свою жизнь и немного про программирование.

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

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

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

Ctrl ←Goracle
Ctrl →Mu, H, D, Т
11 комментариев
Степан Анчугов 2015

Ага, как раз вот только что написал пулл-реквест, заменяющий dirname(__FILE__) на __DIR__, сравнил опкоды и задумался о том, как в Ruby происходит подобный процесс оптимизации интерпретатора. Там происходят от версии к версии примерно подобные улучшения, которые сводят на нет эффекты микрооптимизаций.

Евгений Степанищев (bolknote.ru) 2015

Комментарий для Степан Анчугов:

Ого, полезно (правда, мы в коде всё это заменили уже), можно посмотреть на пуллреквест?

Alexander 2015

Что такое опкоды в контексте PHP? Вместо вызова функции команды будут встроены непосредственно?

Евгений Степанищев (bolknote.ru) 2015

Комментарий для Alexander:

http://php.net/manual/en/internals2.opcodes.php

q 2015

А какие есть фундаментальные преграды для того, чтобы оптимизировать вызовы функций?

Евгений Степанищев (bolknote.ru) 2015

Комментарий для q:

В PHP7 оптимизированы будут (есть RFC уже, за него проголосовали), но опкоды всё равно дешевле.

Владимир Фаршатов 2020

А в какой версии появится волшебное слово inline для функций в 1-2 оператора (геттеры в первую очередь)?

Евгений Степанищев 2020

А в каких-то интерпретаторах оно есть?

Владимир Фаршатов 2020

врядли. Но, кмк, это упущение и существенное.
И ещё: есть оптимизация опкода на предмет констаного не исполнения блока?
Пример: if( false ){ тут что-то было }, как вариант IF( MY_CONST ){ что-то делаем }
Во втором случае, значение константы известно (скажем глобал или константа класса), соответственно или then или else часть можно выкинуть как неисполняемую (если она есть), а вместе с ней и лишнее ветвление.

Евгений Степанищев 2020

Посмотрим что там будет уметь JIT в ПХП8, вероятно что-то такое он со временем научится делать.

Владимир Фаршатов 2020

И ещё: https://yiiframework.ru/forum/viewtopic.php?f=4&t=62384 (место не удачное конечно же) делал небольшой тестик. Дороговато вызов функции для типового геттера, а их многа.. :)

Владимир Фаршатов 2020

И оттуда же ещё мысля: как понимаю, use .. подгружает класс (трейт) в код исполнения, но .. с учетом «неисполняемого кода» (выше пример) он может оказаться не нужным вовсе — загрузка «ленивая» (после проверки что надо в коде класса) или «жадная» (сразу как встретилось)?

Евгений Степанищев 2020

Так посмотрите самостоятельно — в каком момент вызывается автолоадер.

Владимир Фаршатов 2020

О, приношу извинения. Думал Вы в этом участвуете. Поищу авторов, спасибо.

Евгений Степанищев 2020

Они все тут: https://www.php.net/