Вызов функции в PHP стоит дорого. Вот небольшой тест для тестирования:
<?php
const RUNS = 1000000;
// create test string
$string = str_repeat('a', 1000);
$maxChars = 500;
// with function call
$start = microtime(true);
for ($i = 0; $i < RUNS; ++$i) {
strlen($string) <= $maxChars;
}
echo 'with function call: ', microtime(true) - $start, "\n";
// without function call
$start = microtime(true);
for ($i = 0; $i < RUNS; ++$i) {
!isset($string[$maxChars]);
}
echo 'without function call: ', microtime(true) - $start;
Это тестирует функционально идентичный код сначала с использованием функции (strlen
), а затем без использования функции (isset
не является функцией).
Я получаю следующий вывод:
with function call: 4.5108239650726
without function call: 0.84017300605774
Как вы можете видеть, реализация, использующая вызов функции, более чем в пять (5,38) раз медленнее, чем реализация, не вызывающая какую-либо функцию.
Я хотел бы знать, почему вызов функции такой дорогой. Какое главное узкое место? Это поиск в хэш-таблице? Или что так медленно?
Я вернулся к этому вопросу и решил снова запустить тест, с полностью отключенным XDebug (не только отключенным профилированием). Это показало, что мои тесты были довольно запутанными, на этот раз с 10000000 прогонов, которые я получил:
with function call: 3.152988910675
without function call: 1.4107749462128
Здесь только вызов функции примерно в два раза (2,23) медленнее, поэтому разница намного меньше.
Я только что протестировал приведенный выше код на снимке PHP 5.4.0 и получил следующие результаты:
with function call: 2.3795559406281
without function call: 0.90840601921082
Здесь разница снова немного увеличилась (2,62). (Но с другой стороны, время выполнения обоих методов значительно сократилось).