Rzecz o tworzeniu stringów w PHP.

PHP od początku oferuje wiele różnych sposobów na wygenerowanie takiego samego stringa. Ale który z nich jest najszybszy? W tym celu przeprowadziłem serię 9 testów – każdy test wykonywał się w pętli o 10 000 000 iteracji i budował string w inny sposób:

1. $a = sprintf("ala ma kota numer %d", $i);
2. $a = "ala ma kota numer " . $i;
3. $a = 'ala ma kota numer ' . $i;
4. $a = "ala ma kota numer $i";
5. $a = sprintf("ala ma kota numer %d%c%c%c%c%c%c%c%c%c%c", $i, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL);
6. $a = "ala ma kota numer " . $i . "\n\n\n\n\n\n\n\n\n\n";
7. $a = 'ala ma kota numer ' . $i . "\n\n\n\n\n\n\n\n\n\n";
8. $a = "ala ma kota numer $i\n\n\n\n\n\n\n\n\n\n";
9. $a = sprintf("ala ma kota numer %d%s%s%s%s%s%s%s%s%s%s", $i, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL, PHP_EOL);

Oczywiście nie wyczerpałem wszystkich możliwych kombinacji, ale przypuszczam że dość dobrze przedstawiłem istotę wszystkich możliwych do wykorzystania technik. Testy przeprowadziłem na wszystkich posiadanych wersjach PHP: 5.3.9; 5.4.45; 5.5.38; 5.6.31; 7.0.22; 7.1.8; 7.2.0beta2. Wszystkie wersje mają praktycznie takie same konfiguracje, zero dodatkowych modułów – okazało się np. że xdebug potrafi nieźle spowolnić interpreter.

Porównanie czasu wykonywania poszczególnych testów jest następujące:

1

Można by się spodziewać, że skoro fukncja sprintf() jest praktycznie taka sama jest w C (w którym został napisany PHP) to będzie proste mapowanie i będzie ona najszybsza, a tymczasem jest najwolniejsza; a im więcej argumentów (testy 5 i 9) tym czas wykonania znacznie większy… Masakra.
Między testami wykorzystującymi składnię typową dla PHP nie ma większych różnic, choć jestem mocno zaskoczony faktem, że składnia „asd $zmienna” jest najszybsza dla PHP7.x – jednocześnie jest to dla mnie konstrukcja najbardziej podatna na możliwość popełnienia błędu przez programistę.

Porównanie wydajności w zależności od wersji PHP nie było zaskoczeniem:

iqsi-screenshot (14)

PHP 5.3 najwolniej, PHP 7.2 najszybciej. Widać oczywiście poprawę z wersji na wersję i gwałtowne przyspieszenie dla wersji 7.x w związku z nowym silnikiem.

Jeśli ktoś jest zainteresowany dokładnymi danymi to mogę przesłać tabelkę w excelu.

Autorem tekstu jest Łukasz Bugaj.

0 0 votes
Article Rating
Subscribe
Powiadom o
0 komentarzy
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments