PHP7: функции → опкоды
Как известно, в ПХП7 некоторые функции будут заменены на опкоды для ускорения работы. Вызов функции — дорогая операция в этом интерпретаторе, а опкоды — дёшевы. Я заглянул в исходные коды (см. функцию zend_try_compile_special_func, если интересно) и нашёл там список функций, которые заменяются в текущей версии «семёрки».
Это strlen, все функции is_* (is_float, is_string и прочие), defined, call_user_func_array, call_user_func и assert.
Ага, как раз вот только что написал пулл-реквест, заменяющий dirname(__FILE__) на __DIR__, сравнил опкоды и задумался о том, как в Ruby происходит подобный процесс оптимизации интерпретатора. Там происходят от версии к версии примерно подобные улучшения, которые сводят на нет эффекты микрооптимизаций.
Комментарий для Степан Анчугов:
Ого, полезно (правда, мы в коде всё это заменили уже), можно посмотреть на пуллреквест?
Что такое опкоды в контексте PHP? Вместо вызова функции команды будут встроены непосредственно?
Комментарий для Alexander:
http://php.net/manual/en/internals2.opcodes.php
А какие есть фундаментальные преграды для того, чтобы оптимизировать вызовы функций?
Комментарий для q:
В PHP7 оптимизированы будут (есть RFC уже, за него проголосовали), но опкоды всё равно дешевле.
А в какой версии появится волшебное слово inline для функций в 1-2 оператора (геттеры в первую очередь)?
А в каких-то интерпретаторах оно есть?
врядли. Но, кмк, это упущение и существенное.
И ещё: есть оптимизация опкода на предмет констаного не исполнения блока?
Пример: if( false ){ тут что-то было }, как вариант IF( MY_CONST ){ что-то делаем }
Во втором случае, значение константы известно (скажем глобал или константа класса), соответственно или then или else часть можно выкинуть как неисполняемую (если она есть), а вместе с ней и лишнее ветвление.
Посмотрим что там будет уметь JIT в ПХП8, вероятно что-то такое он со временем научится делать.
И ещё: https://yiiframework.ru/forum/viewtopic.php?f=4&t=62384 (место не удачное конечно же) делал небольшой тестик. Дороговато вызов функции для типового геттера, а их многа.. :)
И оттуда же ещё мысля: как понимаю, use .. подгружает класс (трейт) в код исполнения, но .. с учетом «неисполняемого кода» (выше пример) он может оказаться не нужным вовсе — загрузка «ленивая» (после проверки что надо в коде класса) или «жадная» (сразу как встретилось)?
Так посмотрите самостоятельно — в каком момент вызывается автолоадер.
О, приношу извинения. Думал Вы в этом участвуете. Поищу авторов, спасибо.
Они все тут: https://www.php.net/