veydlin
@veydlin
Мне никогда не жалко средств на свое любопытство

Дает ли строгая типизация в PHP 7 прирост производительности?

Дает ли строгая типизация в PHP 7 прирост производительности?
Не нашел ответа на этот вопрос, везде пишут только что это такое, но дает ли оно пользу (кроме более жесткого контроля кода)?
  • Вопрос задан
  • 4362 просмотра
Решения вопроса 1
Начал писать ответ комментарий https://toster.ru/answer?answer_id=937197, но ответ получился большим и поэтому решил поместить его отдельно.

DevMan , я попробую уточнить ваше утверждение, что немного снижает.
На самом деле, при использовании скалярных тайпхинтов снижается производительность вызова функций, поскольку возникает некий дополнительный оверхед на валидацию аргументов и приведение значений к нужным типам (если не используется strict_types). Но! Так как внутри функции значения аргументов уже приведены к нужным типам, то при использовании аргументов не происходит неявного приведения типа.
Поясню на синтетическом примере:
function foo($x) {
    $result = 0;
    for ($i = 0; $i < 100; $i++) {
        $result += $i + $x;
    }
    return $result;
}


Если вызвать эту функцию так: "foo('123')", то в таком случае внутри цикла аргумент будет неявно приводится к целому числу 100 раз. Если вызвать функцию так: "foo(123)", то в таком случае аргумент не будет внутри цикла приводится к целому числу. Очевидно, что второй вариант более производительный:
~$ time php70 -r 'function foo($x) { $result = 0; for ($i = 0; $i < 10000000; $i++) { $result += $i + $x; } } foo("123");'

real    0m0.860s
user    0m0.855s
sys     0m0.005s

~$ time php70 -r 'function foo($x) { $result = 0; for ($i = 0; $i < 10000000; $i++) { $result += $i + $x; } } foo(123);'

real    0m0.508s
user    0m0.500s
sys     0m0.008s


В то же самое время, если добавить к аргументу скалярный тайпхинт, то тогда значение аргумента один раз будет приведено к тайпхинту и внутри функции уйдёт весь оверхед связанный с неявным приведением типа:
~$ time php70 -r 'function foo(int $x) { $result = 0; for ($i = 0; $i < 10000000; $i++) { $result += $i + $x; } } foo("123");'

real    0m0.502s
user    0m0.498s
sys     0m0.003s

~$ time php70 -r 'function foo(int $x) { $result = 0; for ($i = 0; $i < 10000000; $i++) { $result += $i + $x; } } foo(123);'

real    0m0.504s
user    0m0.495s
sys     0m0.008s


Таким образом скалярные тайпхинты и правда оказывают некий малозаметный оверхед на вызов функции, но при этом они убирают дальнейший оверхед связанный с неявными приведениями значений, таким образом, в среднем код может и ускорится при использовании скалярных тайпхинтов, а в среднем общая производительность останется такой же.

Зато использование строгой типизации не даст запустить функцию в неконтроллируемом состоянии: когда функция ожидает на вход целое число, а по какой-то причине подсунули массив:
$var = $_GET['foo'];
bar($var);
, для get-параметра foo=123 вызов будет корректным, а для foo[]=123 вызов функции приведёт к TypeError; для foo=abc тоже будет TypeError. Разумеется, этот пример сильно надуман и тут нужно использовать "нормальный" валидатор.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
banderos120
@banderos120
Играю на балалайке
По первому запросу:
stackoverflow.com/questions/32940170/are-scalar-an...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы