Я только что нашел что-то очень странное в PHP.
Если я передаю переменную функции по ссылке, а затем вызову функцию на ней, она невероятно замедляется.
Если вы зацикливаете вызов внутренней функции и переменная велика, она может быть на несколько порядков медленнее, чем если переменная передается по значению.
Пример:
<?php
function TestCount(&$aArray)
{
$aArray = range(0, 100000);
$fStartTime = microtime(true);
for ($iIter = 0; $iIter < 1000; $iIter++)
{
$iCount = count($aArray);
}
$fTaken = microtime(true) - $fStartTime;
print "took $fTaken seconds\n";
}
$aArray = array();
TestCount($aArray);
?>
Это постоянно занимает около 20 секунд для запуска на моем компьютере (на PHP 5.3).
Но если я изменяю функцию для передачи по значению (т.е. function TestCount($aArray)
вместо function TestCount(&$aArray)
), то она работает примерно в 2 мс - буквально в 10 000 раз быстрее!
То же самое верно для других встроенных функций, таких как strlen
и для пользовательских функций.
Что происходит?