2015-12-04 15 views
9

foreach w PHP7 Domyślnie podczas iteracji przez wartość, pracuje na kopii tablicy według: http://php.net/manual/en/migration70.incompatible.phpzmiany foreach w PHP7

Czy leniwie utworzyć kopię tylko wtedy, gdy występują zmiany wprowadzone do tablicy lub wartość czy będzie zawsze tworzyć kopię iw gruncie rzeczy sprawiać, że pętla odwoła się do optymalizacji wydajności?

Co więcej, czy tablice obiektów wciąż są w pętli/dają odniesienia do obiektów? Czy faktycznie będą one również tworzyć kopie dla obiektu foreach i zwracać obiekty według wartości?

+0

Zgodnie z [najlepsza odpowiedź tutaj] (http://stackoverflow.com/questions/10057671/how-does-foreach-actually-work?rq=1) istnieje również kopia wykonana w PHP5 podczas iteracji według wartości. – Kenney

+2

Sugestia: Po prostu powtarzaj i nie próbuj optymalizować, pisząc efektywny kod. Większość czasu wystarczy użyć konstrukcji i pozwolić im wymyślić, jak wykonać kod. Tylko jeśli zmierzysz tę wydajność, nie można zaakceptować, czy chcesz wprowadzić zmianę. (Nie jest to odpowiedź lub zdanie w dół, ponieważ istnieje akademicki powód zadawania pytania, ale warto to stwierdzić) – ircmaxell

+0

@ircmaxell można to sformułować briefer: http://stackoverflow.com/questions/385506/when-is-optimisation- przedwczesny –

Odpowiedz

12

W PHP 7, jeśli przetestujesz tablicę według wartości, kopia zostanie wykonana leniwie, tylko wtedy, gdy tablica zostanie faktycznie zmodyfikowana.

Jeśli zamiast tego powtórzysz tablicę przez odniesienie, zostanie wykonana separacja na początku pętli. Jeśli tablica jest obecnie używana w więcej niż jednym miejscu, separacja ta prowadzi do kopii.

Ponadto iteracja przez odniesienie oznacza, że ​​a) tablica musi być owinięta w odnośnik i b) każdy element musi być również zawinięty w odnośnik. Tworzenie opakowania referencyjnego jest kosztowną operacją, ponieważ wymaga przydziału.

Dodatkowa iteracja przez odwołanie wymaga użycia mechanizmu iteracji bezpiecznej dla modyfikacji. Działa to poprzez rejestrację iteratora z tablicą i sprawdzanie potencjalnie zmienionych iteratorów w różnych operacjach modyfikacji macierzy.

Więc nie, iteracja przez odniesienie nie jest z pewnością optymalizacją, jest to de-optymalizacja. Używanie referencji zwykle jest.