Różnica wydajności w użyciu ++$i a $i++

Odkąd zacząłem programować w języku PHP za każdym razem kiedy chciałem w pętli zwiększyć wartość zmiennej typu integer o jeden zastanawiałem się którego operatora użyć. To nieustające pytanie wzięło się jeszcze z czasów studiów, kiedy uczyłem się/programowałem w języku C++. Podczas jednego z wykładów zostałem wtajemniczony w zagadnienie przeładowywania operatorów i zrozumiałem jaka jest różnica pomiędzy nimi. W teorii pre-inkrementacja ( ++$i  = zwiększ i zwróć wartość) jest szybszą operacją niż post-inkrementacja ( $i++  = zachowaj starą wartość w zmiennej tymczasowej, zwiększ wartość i zwróć starą wartość) ponieważ ta druga wymaga stworzenia dodatkowej zmiennej co przy bardzo dużej ilość iteracji może mieć znaczenie.

Postanowiłem więc porównać kilka najczęściej spotykanych wariantu dodawania jedynki do zmiennej, aby sprawdzić który operator jest najszybszy:

  • ++$i,
  • $i++,
  • $i += 1,
  • $i = $i + 1.

Program

Wyniki

Powyższy program wykonałem na moim podstarzałym laptopie Acer Aspire 4930 (Intel Core 2 Duo T6600 2.20GHz) oraz PHP w wersji 5.5.12. W programie dołożyłem powtórzenia za pomocą odświeżenia strony ( header('Refresh: 0; url=...)), aby nie przekroczyć limitu czasowego wykonywania programu. Odczekałem wystarczająco dużo czasu, aby otrzymać 227 powtórzeń po 1 000 000 iteracjach dla każdej z metod. Ilość powtórzeń pozwoliła mi zniwelować zakłamania spowodowane przełączaniem kontekstu. Po wyciągnięciu średniej ze wszystkich wykonań programu otrzymałem następujące czasy wykonania 1 miliona iteracji dla każdego z operatorów:

iplusplus1

Podsumowanie

Muszę przyznać że różnice czasowe w wykonaniu poszczególnych operatorów przerosły moje oczekiwania. Wykonanie operacji ++$i jest o 16,45% szybsze niż $i++  i o 7,49% szybsze niż $i += 1 . Różnica pomiędzy $i += 1 , a $i = $i + 1  jest niewielka, bo wynosi jedynie jeden procent.

 

Różnica wydajności w użyciu ++$i a $i++

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *