Translate: 
EnglishFrenchGermanItalianPolishPortugueseRussianSpanish

HipHop for PHP: Test wydajności


  click here for english version

Benchmark iconNa stronie shootout.alioth.debian.org znajduje się bardzo ciekawy benchmark porównujący ze sobą wydajność wielu różnych języków programowania. O ile daleki jestem od prowadzenia dyskusji na temat wyższości jednego języka nad drugim, uznałem, że ciekawie byłoby wykonać mały test prędkości pomiędzy PHP a… PHP (skompilowanym przy pomocy HipHop for PHP).

Mam nadzieję, że testy które przedstawiam poniżej okażą się pomocne w udzieleniu odpowiedzi, jak bardzo PHP przyspiesza po skompilowaniu, oraz czy HipHop for PHP jest faktycznie tak wydajny, jak twierdzą developerzy Facebooka.


Zobacz szokujące wyniki drugiej części benchmarku w artykule: HipHop for PHP: Benchmark – rewanż PHP


Uwagi wstępne

Materiał tu przedstawiany ma jedynie charakter poglądowy. Tak jak we wszystkich moich artykułach, tak i tutaj nie zamierzam opisywać dokładnie konfiguracji systemu, prowadzić szczegółowych statystyk, ich rozkładów, ani wykonywać tysięcy powtórzeń dla każdego testu. We wszystkich benchmarkach staram się powtarzać testy tylko tyle razy, ile potrzebuję by upewnić się, że wyniki jakie otrzymuję są stabilne.

W ramach prezentowania wyników nie wklejam do artykułu pełnego wyjścia wygenerowanego przez skrypty testowe, jeśli wyniki te zajmują więcej niż kilka linijek tekstu.
W takim przypadku wyjście przekierowuję do pliku out.txt i podaję tylko czasy wykonania programów otrzymane poleceniem tail out.txt

Wyciągnięcie końcowych wniosków, oraz dokładniejsze testy pozostawiam czytelnikom.

Platforma testowa

Procesor: Intel(R) Core(TM)2 Duo CPU E7600 @ 3.06GHz
Pamięć: 1GB RAM (powiększona do 2,5GB RAM dla testu nr. 6)
System: Fedora 12 (64bit)
Kernel: 2.6.32.26-175.fc12.x86_64 #1 SMP

Maszyna była wykorzystywana wyłącznie do testów – w tle działały tylko usługi związane z przeprowadzanymi benchmarkami.

Wyniki testów

Poniżej przedstawiam wyniki porównawcze pomiędzy tradycyjnym językiem PHP a HipHop for PHP. Wszystkie podawane w testach czasy wykonania skryptów są prezentowane w sekundach (im niższe czasy, tym lepiej).

Test nr 1: n-body (Perform an N-body simulation of the Jovian planets)

Kod pliku źródłowego w PHP:
http://shootout.alioth.debian.org/u32/program.php?test=nbody&lang=php&id=3

Wyniki w PHP:

[root@localhost src]# php -n bench.php 50000000
-0.169075164
-0.169059907
DONE IN 754.474136

Oraz wynik w HipHop for PHP:

[root@localhost src]# /tmp/hphp_z8ZAiC/program 50000000
-0.169075164
-0.169059907
DONE IN 360.381707

Jak widać w tym teście HipHop for PHP jest ponad dwa razy szybszy od zwykłego PHP.

Test nr 2: fannkuch-redux (Repeatedly access a tiny integer-sequence)

Kod pliku źródłowego w PHP:
http://shootout.alioth.debian.org/u32/program.php?test=fannkuchredux&lang=php&id=1

Wyniki w PHP:

[root@localhost src]# php -n bench2.php 12
3968050
Pfannkuchen(12) = 65
DONE IN 3545.183693

Oraz wynik w HipHop for PHP:

[root@localhost src]# /tmp/hphp_4gdbXK/program 12
3968050
Pfannkuchen(12) = 65
DONE IN 1360.819455

Także i tutaj nie było niespodzianek, skompilowany skrypt PHP okazał się ponownie ponad dwa razy szybszy.

Test nr 3: fasta (Generate and write random DNA sequences)

Kod pliku źródłowego w PHP:
http://shootout.alioth.debian.org/u32/program.php?test=fasta&lang=php&id=3

Wyniki w PHP:

[root@localhost src]# php -n bench3.php 25000000 > out.txt
DONE IN 138.252463

Oraz wynik w HipHop for PHP:

[root@localhost src]# /tmp/hphp_dKRE8V/program 25000000 > out2.txt
DONE IN 55.924453

HipHop for PHP w dalszym ciągu utrzymuje dwukrotną przewagę.

Test nr 4: spectral-norm (Calculate an eigenvalue using the power method)

Kod pliku źródłowego w PHP:
http://shootout.alioth.debian.org/u32/program.php?test=spectralnorm&lang=php&id=3

Wyniki w PHP:

[root@localhost src]# php -n bench4.php 5500
1.274224153
DONE IN 238.810613

Oraz wynik w HipHop for PHP:

[root@localhost src]# /tmp/hphp_N7arkg/program 5500
1.274224153
DONE IN 93.717688

Test nr 5: mandelbrot (Generate a Mandelbrot set and write a portable bitmap)

Kod pliku źródłowego w PHP:
http://shootout.alioth.debian.org/u32/program.php?test=mandelbrot&lang=php&id=1

Wyniki w PHP:

[root@localhost src]# php -n bench5.php 16000 > out.txt
DONE IN 1532.191153

Oraz wynik w HipHop for PHP:

[root@localhost src]# /tmp/hphp_cMY58k/program 16000 > out2.txt
DONE IN 569.224470

Tutaj różnica pomiędzy zwykłym PHP, a skompilowanym robi się jeszcze większa, czas wykonania skryptu zmalał niemal trzykrotnie.

Test nr 6: binary-trees (Allocate and deallocate many many binary trees)

Kod pliku źródłowego w PHP:
http://shootout.alioth.debian.org/u32/program.php?test=binarytrees&lang=php&id=3

Wyniki w PHP:

[root@localhost src]# php -n -d memory_limit=2048M bench6.php 16
stretch tree of depth 17   check: -1
131072  trees of depth 4   check: -131072
32768  trees of depth 6  check: -32768
8192   trees of depth 8  check: -8192
2048   trees of depth 10   check: -2048
512  trees of depth 12  check: -512
128  trees of depth 14  check: -128
32   trees of depth 16  check: -32
long lived tree of depth 16    check: -1
DONE IN 37.286621

Oraz wynik w HipHop for PHP:

[root@localhost src]# /tmp/hphp_s93MOe/program 16
stretch tree of depth 17   check: -1
131072  trees of depth 4   check: -131072
32768  trees of depth 6  check: -32768
8192   trees of depth 8  check: -8192
2048   trees of depth 10   check: -2048
512  trees of depth 12  check: -512
128  trees of depth 14  check: -128
32   trees of depth 16  check: -32
long lived tree of depth 16    check: -1
DONE IN 11.450954

Po wielu różnego rodzaju testach udało nam się w końcu przekroczyć barierę 300%. Podejrzewam, że w tym przypadku za lepszy wynik odpowiada częściowo szybsza obsługa funkcji w C++, używanych nagminnie w ramach pętli testowej.

Update testu

Poprzedni test wykonałem wyjątkowo na mniejszej próbce danych (n=16) niż w teście referencyjnym, gdyż potencjalne zużycie pamięci przekraczało fizyczne możliwości serwera testowego.

Zaintrygowany wynikami oraz informacjami programistów Facebooka o mniejszym zużyciu pamięci przez HipHop for PHP, postanowiłem powtórzyć test na referencyjnej próbce danych n=20 (takiej jak w teście na stronie shootout’u). W tym celu zaopatrzyłem maszynę testową w dodatkowe 1,5GB RAMu. Oto rezultaty.

Wyniki w PHP:

[root@localhost src]# php -n -d memory_limit=2548M bench6.php 20
stretch tree of depth 21         check: -1
2097152  trees of depth 4        check: -2097152
524288   trees of depth 6        check: -524288
131072   trees of depth 8        check: -131072
32768    trees of depth 10       check: -32768
8192     trees of depth 12       check: -8192
2048     trees of depth 14       check: -2048
512      trees of depth 16       check: -512
128      trees of depth 18       check: -128
32       trees of depth 20       check: -32
long lived tree of depth 20      check: -1
DONE IN 1020.273547

Oraz wynik w HipHop for PHP:

[root@localhost src]# /tmp/hphp_s93MOe/program 20
stretch tree of depth 21         check: -1
2097152  trees of depth 4        check: -2097152
524288   trees of depth 6        check: -524288
131072   trees of depth 8        check: -131072
32768    trees of depth 10       check: -32768
8192     trees of depth 12       check: -8192
2048     trees of depth 14       check: -2048
512      trees of depth 16       check: -512
128      trees of depth 18       check: -128
32       trees of depth 20       check: -32
long lived tree of depth 20      check: -1
DONE IN 249.907754

Jak widać tym razem HipHop for PHP okazał się szybszy o ponad 400%. Także zużycie pamięci było znacznie niższe. Czysty skrypt zajmował 2465MB, podczas gdy jego skompilowany odpowiednik tylko 1802MB (ponad 600MB różnicy!).

Podsumowanie

Oto jak przedstawiały się wyniki poszczególnych testów:

Nazwa testu PHP HipHop Różnica
n-body 754.474136 360.381707 209,35%
fannkuch-redux 3545.183693 1360.819455 260,52%
fasta 138.252463 55.924453 247,21%
spectral-norm 238.810613 93.717688 254,81%
mandelbrot 1532.191153 569.224470 269,17%
binary-trees (16) 37.286621 11.450954 325,62%
binary-trees (20) 1020.273547 249.907754 408,26%

Dla czytelności prezentuję też dane na wykresie:

HipHop for PHP benchmark

Jak widać z powyższych wyników HipHop for PHP drastycznie przyspiesza wykonywanie skryptów. Różnice w czasie sięgają od 200 do ponad 400% i to bez konieczności jakiejkolwiek ingerencji w kod źródłowy plików PHP.

Także zużycie pamięci jest znacznie mniejsze w przypadku skryptów PHP skompilowanych HipHop’em (nawet o 25%).

Niestety podczas testów wyszły na jaw także i pewne niekompatybilności z czystym językiem PHP: np. brak obsługi biblioteki gmp (przez to nie udało się wykonać testu pidigits).

Problemom z niekompatybilnością HipHop for PHP poświęcony jest oddzielny artykuł.

Tagi: , , , ,

Dodaj odpowiedź