2013-08-05 21 views
5

Mam tablicę, która przechowuje wiele odwołań do jednego anonymous function:Czy silnik PHP optymalizuje anonimowe funkcje w pętlach?

$fns = array(); 
//some code 
$fn = function(){ 
    echo 'this is closure 12345... < 67890'; 
    // etc etc.. 
}; 
for($x=12345; $x<67890; ++$x){ 
    $fns[$x] = $fn; 
} 

Jak widać, tworzymy tylko jedenanonimową funkcję.

Co jeśli wstawimy deklarację funkcji do pętli? :

$fns = array(); 
//some code 
for($x=12345; $x<67890; ++$x){ 
    $fns[$x] = function(){ 
     echo 'this is closure 12345... < 67890'; 
     // etc etc.. 
    }; 
} 

Czy silnik jest na tyle inteligentny, że rozpoznaje, że potrzebny jest tylko jeden obiekt?

Czy powyższy kod tworzy tylko jeden obiekt lub tworzy jeden obiekt w iteracji?

(pytanie jest skierowane zarówno HHVM i Zend Engine.)

+0

Czy profil go? 300 obiektów to nic. Prawdopodobnie nie będziesz w stanie zmierzyć różnicy z tymi kilkoma obiektami. Dopóki nie zaczniesz tworzyć milionów obiektów, różnica jest znikoma. – Gordon

+0

@Gordon http://stackoverflow.com/questions/239136/fastest-way-to-convert-string-to-integer-in-php#comment-4932053 – Pacerier

+0

http://c2.com/cgi/wiki?PrematureOptimization – Gordon

Odpowiedz

5

Jeśli tworzysz funkcję wewnątrz pętli, tworzysz 300 indywidualna funkcja anonimowa obiektów. PHP nie optymalizuje tego, ponieważ może tego właśnie chcesz. To jest dużo niższa niż mniej wydajna niż tworzenie funkcji przed pętlą.

Oto dowód, że dwa niezależne obiekty dostać utworzona: http://3v4l.org/f3cdE

+0

Ale skoro anonimowe funkcje są niezmienne, czy nie jest prawdą, że silnik * powinien * zoptymalizował to dla nas? – Pacerier

+2

Dla tego PHP najpierw musiałby przeanalizować, czy funkcje są dokładnie takie same *. Immutabity nie jest problemem, * identyczność * jest. Jeśli w zamknięciu znalazłeś jakieś zewnętrzne zmienne, trudno byłoby o tym powiedzieć. I tak czy inaczej, PHP * nie *, niezależnie od tego, czy * powinien *. PHP prawie robi to, co mówisz; nie jest to język bardzo abstrakcyjny, jak Haskell. – deceze

+4

PHP wymaga zadeklarowania zmiennych zewnętrznych, które powinny się odnosić w zamknięciu deklaracją "use ()". Analizator składni może łatwo stwierdzić, że funkcja nie ma tej opcji, więc wszystkie są takie same. – Barmar