Действительно ли накладные расходы на вызов пользовательской функции настолько велики?Или скорее это действительно так велико сейчас?Как PHP, так и компьютерное оборудование продвинулись стремительно за почти 7 лет с тех пор, как этот вопрос был задан изначально.
Ниже я написал свой собственный скрипт для сравнительного анализа, который вызывает mt_rand () в цикле как напрямую, так и черезвызов пользовательской функции:
const LOOPS = 10000000;
function myFunc ($a, $b)
{
return mt_rand ($a, $b);
}
// Call mt_rand, simply to ensure that any costs for setting it up on first call are already accounted for
mt_rand (0, 1000000);
$start = microtime (true);
for ($x = LOOPS; $x > 0; $x--)
{
mt_rand (0, 1000000);
}
echo "Inline calling mt_rand() took " . (microtime(true) - $start) . " second(s)\n";
$start = microtime (true);
for ($x = LOOPS; $x > 0; $x--)
{
myFunc (0, 1000000);
}
echo "Calling a user function took " . (microtime(true) - $start) . " second(s)\n";
Результаты по PHP 7 на настольном компьютере на базе i5 2016 года сбора винограда (в частности, процессор Intel® Core ™ i5-6500 @ 3,20 ГГц × 4) выглядят следующим образом:
Встроенный вызов mt_rand () занял 3,5181620121002 секунд. Вызов пользовательской функции занял 7,2354700565338 секунд.
Издержки при вызове пользовательской функции, по-видимому, примерно удваивают время выполнения.Но потребовалось 10 миллионов итераций, чтобы это стало особенно заметным.Это означает, что в большинстве случаев различия между встроенным кодом и пользовательской функцией, вероятно, будут незначительными.Вы должны действительно беспокоиться об этом виде оптимизации в самых внутренних циклах вашей программы, и даже тогда, только если бенчмаркинг демонстрирует явную проблему производительности там.Все остальное было бы микрооптимизацией , которая практически не принесла бы значительного выигрыша в производительности для дополнительной сложности в исходном коде.
Если ваш PHP-скрипт медленный, то почти наверняка есть вероятность, что он будет связан с вводом-выводом или плохим выбором алгоритма, а не с накладными расходами при вызове функции.Подключение к базе данных, выполнение запроса CURL, запись в файл или даже просто отображение на стандартный вывод - все это на несколько порядков дороже, чем вызов пользовательской функции.Если вы мне не верите, попросите mt_rand и myfunc повторить вывод и посмотреть, насколько медленнее работает скрипт!
В большинстве случаев лучший способ оптимизировать PHP-скрипт - это минимизировать количество операций ввода-вывода, которые он должен выполнять (выбирайте только то, что вам нужно в запросах к БД, а не полагайтесь на PHP для фильтрации нежелательных строк,например), или получить его для кэширования операций ввода-вывода через что-то вроде memcache, чтобы снизить стоимость ввода-вывода для файлов, баз данных, удаленных сайтов и т. д.