Michał Środek

Moje przemyślenia

Witaj na srodek.info

Jest to blog poświęcony nowoczelnym technologiom ułatwiającym tworzenie aplikacji internetowych. Znajdziesz tutaj porady na temat CSS3, JavaScript, designu, web-usability, standardów W3C.

Cześć! Nazywam się Michał Środek. Z zawodu programista php, z zamiłowania gitarzysta oraz fanatyk GNU/Linuksa(openSUSE® w laptopie). W branży aplikacji internetowych od 9 lat. Prywatnie bez dzieci i kota.

Pracuję wciąż nad własnym elastycznym i wydajnym frameworkiem MVC, kilkoma portalami internetowymi oraz mniejszymi bibliotekami php. Czekam na wasze opinie, zgłoszenia błędów oraz pomysły na dalszy rozwój.

Ta część strony jest w trakcie budowy a moje prace tymczasowo niedostępne.

Przypadku pytań, ofert pracy oraz ciekawych pomysłów proszę się ze mną kontaktować. Na głupie pytania nie odpowiadam.

Możesz mnie znaleźć i wysłać PW na php.pl(SHiP), jamendo.com(michalsrodek), goldenLine lub naszej-klasie

26 Wrzesień 2009

Optymalizacja echo()

Zaszufladkowany do: PHP — Michał Środek @ 13:21

Z doświad­czenia wiem, że programi­ści dzielą się na dwie grupy: tych co będą szukać optymalizacji na kaz­dym kroku oraz tych, którzy wolą dokupić dodat­kową kość RAM i wyspać się zamiast pracować do późna w nocy ;) . Ja oczywi­ście należę do tej pierw­szej. Już samo użycie php nie jest naj­optymal­niej­szym roz­wiązaniem, lecz od czasu do czasu postaram się opisać w kilku słowach jak przy­spieszyć swoje skrypty. Zacznijmy od echo.

1
2
3
$cat = 'Mruczek';
echo "Mój kot ma na imię $cat i jest zawsze wesoły.";
echo 'Mój kot ma na imię '.$cat.' i jest zawsze wesoły';

Spo­sób działania jest prosty. Pod­czas użycia cudzysłowów ciąg znaków jest prze­szukiwany w pod kątem posiadania jakichś zmien­nych. Tutaj one ist­nieją więc skrypt pod­stawia pod $cat ciąg znaków Mruczek. Następ­nie wyrzuca na wyj­ście gotowy napis. W przy­padku użycia apostrofów jest troszkę ina­czej. PHP nie wyszukuje żadnych zmien­nych ponie­waż ma jasno określone miej­sce w którym te zmienne się znaj­dują, co sprawia, że całość działa czasami nawet kil­kukrot­nie szybciej.

Czy dałoby się to jesz­cze bar­dziej przy­spieszyć? Oczywi­ście ;) . Wystar­czy posłużyć się operatorem prze­cinka zamiast kropki.

4
echo 'Mój kot ma na imię ',$cat,' i jest zawsze wesoły';

Więk­szość programistów o tym nie wie ale w przy­padku operatora kropki, PHP naj­pierw tworzy wynikowy ciąg znaków co powoduje dodat­kowe obciążenie pamięci. Przy dwóch krop­kach tworzone są dwie nowe zmienne String(lub dwie tablice znaków — nie będę się zagłębiał w kod wewnętrzny PHP). Jeśli użyjemy prze­cin­ków, PHP po prostu będzie każdy z elemen­tów inter­pretował jak kolejne parametry(choć pamiętajmy — echo nie jest funk­cją!) i wyrzucał je bez­pośred­nio na wyj­ście. Pytanie: czy opłaca się buforować wyj­ście za pomocą kropki(np. w przy­padku długiego czasu dostępu do wyj­ścia)? To już pozostawiam wam do prze­myśleń. Poniżej testy pręd­ko­ści przy użyciu Apache Benchmark:

Wer­sja z cudzysłowami:

Time taken for tests: 100.027 seconds
Complete requests: 32772
Failed requests: 0
Write errors: 0
Total transferred: 8206540669 bytes
HTML transferred: 8201253107 bytes
Requests per second: 327.63 [#/sec] (mean)
Time per request: 305.219 [ms] (mean)

Wer­sja z apostrofami:

Time taken for tests: 100.018 seconds
Complete requests: 42646
Failed requests: 0
Write errors: 0
Total transferred: 10669918695 bytes
HTML transferred: 10663047537 bytes
Requests per second: 426.38 [#/sec] (mean)
Time per request: 234.531 [ms] (mean)

Wer­sja z prze­cin­kiem:

Time taken for tests: 100.029 seconds
Complete requests: 44111
Failed requests: 0
Write errors: 0
Total transferred: 11039258426 bytes
HTML transferred: 11032150759 bytes
Requests per second: 440.98 [#/sec] (mean)
Time per request: 226.766 [ms] (mean)

Nie będę już kom­binował w gnuplocie aby stworzyć ładne wykresy, ale na oko widać, że wer­sja z prze­cin­kiem sprawuje się naj­lepiej. Oczywi­ście wyniki należy przyjąć z lek­kim przy­mrużeniem oka ponie­waż Apache Bench­mark naj­lep­szym narzędziem nie jest. Warto rów­nież uruchomić dobre oprogramowanie do monitorowania pamięci RAM, bo to tam naj­więcej zachodzi zmian — szczegól­nie przy wyświetlaniu dużych par­tii tekstu.

Dodaj artykuł do:

  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Gwar
  • Reddit
  • Technorati
  • Twitter
  • Wykop

7 komentarzy »

  1. Cwane :) Tego z prze­cin­kami nie znałem :)

    Komentarz - autor: Michał Molenda — 29 września 2009, 12:18

  2. No ja też muszę przy­znać, że nie wiedziałem, że tak można ;)
    Ale osobi­ście czę­ściej używam printf do wyświetlania tek­stu :)

    Komentarz - autor: Aenigmatis — 30 września 2009, 11:10

  3. Funk­cja printf jest chyba naj­gor­szym roz­wiązaniem tj. naj­wol­niej­szym. W zasadzie powinno się jej używać tylko pod­czas for­matowania tekstu.

    Komentarz - autor: Michał Środek — 6 października 2009, 16:06

  4. I kolejny nie­świadomy został oświecony. Fak­tycz­nie, o prze­cinku rów­nież nie słyszałem. Dobry spo­sób, dzięki za podanie jego :)

    Komentarz - autor: blk — 17 października 2009, 11:51

  5. A ja sie nie zgodze…

    Komentarz - autor: johny-max — 25 listopada 2009, 10:32

  6. Kolejny post o mikro-optymalizacjach. I znów rzucanie się na te cudzysłowia. Upar­li­ście się ? Do tego używanie Apache bench jest lek­kim nie­po­rozumieniem. Testujesz całe środowisko php i do tego jesz­cze wydaj­ność webser­wera, czy szyb­kość łączenia strin­gów ? Zanim wrzucisz jakiegoś bench­marka, zastanów się może nad tym co za wyniki prezen­tujesz, co ?

    Poczytaj może sobie trochę http://www.brandonsavage.net/micro-optimizations-that-dont-matter/ (w kwesti printf’a włącz­nie, bo Twoje argumenty w tej kwestii też są dość … mało znaczące …)

    Komentarz - autor: ivan — 25 listopada 2009, 23:34

  7. @ivan: artykuł ten jest bar­dziej ciekawostką ponie­waż nie każdy wie o tym, że nie trzeba buforować elemen­tów prze­kazywanych do echo.

    Art­kuł, który pod­rzuciłeś jest praw­dziwy dlatego, że testy autora operowały tylko i wyłącz­nie na tych samych danych które php sobie wrzuca do pamięci cache. Ponadto wykorzystywał on napis z jedną zmienną. Owszem przy tworzeniu nie­wy­mysl­nej stronki inter­netowej róż­nicy nie widać. Zaj­mowałem się swego czasu pisaniem par­sera szablonów i było tam sporo operacji na strin­gach. Mogę kiedyś zrobić test opierający się na generowaniu i łączeniu losowych znaków. Wtedy widać, że róż­nica jest ogromna.

    Co więcej, dla mnie liczy się odpowiedni styl programowania a cudzysłowia powodują jedynie zamieszanie wśród począkujących — widzialem np. kwiatki typu echo „$zmienna“;

    Co do Apache Bench­mark — prze­cież napisałem, że ten test nie jest do końca miarodajny.

    Komentarz - autor: Michał Środek — 26 listopada 2009, 0:24

Kanał RSS z komentarzami do tego wpisu. Adres URL dla TrackBacków

Dodaj komentarz