Что-то в последнее время голова совсем не варит. Решил я по-тестировать работу анонимных функций. Ну конечно же для тестов взял самый простой алгоритм нахождения числа в последовательности фибоначи. Написал два разных алгоритма: с экспоненциальной сложностью (как раз то что нужно) и линейный. Кстати хотел еще и с циклами замутить но не стал. Оставил рекурсивный подход. Так вот. Ниже приведен код и результаты тестов. Или у меня совсем крыша съехала или мой комп тупит или код, но результаты какие-то противоречивые алгоритмам. Совершенно очевидно, что линейный быстрее но почему он же в анонимной функции медленнее экспоненциального собрата в анонимной функции, я вообще уже догнать не могу. Может кто-нить прогнать эти простенькие тесты и показать результаты? Заранее спасибо. И да может я просто не вижу в коде ошибку? Код (PHP): function fibr1($n,$k,$f,$f1){ return $k == $n ? $f : $k < $n ? fibr1($n, $k+1,$f+$f1,$f) : $f; } function fibr2($n){ return $n <= 1 ? 1 : fibr2($n-1)+fibr2($n-2); } $fib1 = function ($n, $k, $f, $f1) use (&$fib1) { return $k == $n ? $f : $k < $n ? $fib1($n, $k+1,$f+$f1,$f) : $f; }; $fib2 = function($n) use (&$fib2) { return $n <= 1 ? 1 : $fib2($n-1)+$fib2($n-2); }; $count = 32; $start = microtime(true); echo "Fib3 recurse1 +: " . fibr1($count,2,1,1) . PHP_EOL; echo "Fib3 recurse1 + time: " . ((microtime(true) - $start)) . PHP_EOL; $start = microtime(true); echo "Fib4 recurse2 -: " . fibr2($count) . PHP_EOL; echo "Fib4 recurse2 - time: " . ((microtime(true) - $start)) . PHP_EOL; $start = microtime(true); echo "Fib1 func +: " . $fib1($count,2,1,1) . PHP_EOL; echo "Fib1 func + time: " . ((microtime(true) - $start)) . PHP_EOL; $start = microtime(true); echo "Fib2 func -: " . $fib2($count) . PHP_EOL; echo "Fib2 func - time: " . ((microtime(true) - $start)) . PHP_EOL; Код (Text): Fib3 recurse1 +: 3524578 Fib3 recurse1 + time: 0.00017213821411133 Fib4 recurse2 -: 3524578 Fib4 recurse2 - time: 1.6537690162659 Fib1 func +: 3524578 Fib1 func + time: 3.0994415283203E-5 Fib2 func -: 3524578 Fib2 func - time: 2.5717799663544 Заметил, что если тесты переставить местами то результаты реально расходятся.
Разделил тесты. Картина стала довольно ясная. Код (Text): andrejm@andrejm:~/PHP$ php fib1.php Fib1 func +: 3524578 Fib1 func + time: 0.00018310546875 andrejm@andrejm:~/PHP$ php fib2.php Fib2 func -: 3524578 Fib2 func - time: 2.4435329437256 andrejm@andrejm:~/PHP$ php fibr1.php Fib3 recurse1 +: 3524578 Fib3 recurse1 + time: 0.00016999244689941 andrejm@andrejm:~/PHP$ php fibr2.php Fib4 recurse2 -: 3524578 Fib4 recurse2 - time: 1.6255810260773