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­cze­nia wiem, że pro­gra­mi­ści dzielą się na dwie grupy: tych co będą szu­kać opty­ma­li­za­cji na kaz­dym kroku oraz tych, któ­rzy wolą doku­pić dodat­kową kość RAM i wyspać się zamiast pra­co­wać do późna w nocy ;) . Ja oczy­wi­ście należę do tej pierw­szej. Już samo uży­cie php nie jest naj­opty­mal­niej­szym roz­wią­za­niem, lecz od czasu do czasu posta­ram się opi­sać w kilku sło­wach jak przy­spie­szyć 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­ła­nia jest pro­sty. Pod­czas uży­cia cudzy­sło­wów ciąg zna­ków jest prze­szu­ki­wany w pod kątem posia­da­nia jakichś zmien­nych. Tutaj one ist­nieją więc skrypt pod­sta­wia pod $cat ciąg zna­ków Mru­czek. Następ­nie wyrzuca na wyj­ście gotowy napis. W przy­padku uży­cia apo­stro­fów jest troszkę ina­czej. PHP nie wyszu­kuje żadnych zmien­nych ponie­waż ma jasno okre­ślone miej­sce w któ­rym te zmienne się znaj­dują, co spra­wia, że całość działa cza­sami nawet kil­ku­krot­nie szybciej.

Czy dałoby się to jesz­cze bar­dziej przy­spie­szyć? Oczy­wi­ście ;) . Wystar­czy posłu­żyć się ope­ra­to­rem prze­cinka zamiast kropki.

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

Więk­szość pro­gra­mi­stów o tym nie wie ale w przy­padku ope­ra­tora kropki, PHP naj­pierw two­rzy wyni­kowy ciąg zna­ków co powo­duje dodat­kowe obcią­że­nie pamięci. Przy dwóch krop­kach two­rzone są dwie nowe zmienne String(lub dwie tablice zna­ków — nie będę się zagłę­biał w kod wewnętrzny PHP). Jeśli uży­jemy prze­cin­ków, PHP po pro­stu będzie każdy z ele­men­tów inter­pre­to­wał jak kolejne parametry(choć pamię­tajmy — echo nie jest funk­cją!) i wyrzu­cał je bez­po­śred­nio na wyj­ście. Pyta­nie: czy opłaca się bufo­ro­wać wyj­ście za pomocą kropki(np. w przy­padku dłu­giego czasu dostępu do wyj­ścia)? To już pozo­sta­wiam wam do prze­my­śleń. Poni­żej testy pręd­ko­ści przy uży­ciu Apa­che Benchmark:

Wer­sja z cudzy­sło­wami:

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 apo­stro­fami:

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­bi­no­wał w gnu­plo­cie aby stwo­rzyć ładne wykresy, ale na oko widać, że wer­sja z prze­cin­kiem spra­wuje się naj­le­piej. Oczy­wi­ście wyniki należy przy­jąć z lek­kim przy­mru­że­niem oka ponie­waż Apa­che Bench­mark naj­lep­szym narzę­dziem nie jest. Warto rów­nież uru­cho­mić dobre opro­gra­mo­wa­nie do moni­to­ro­wa­nia pamięci RAM, bo to tam naj­wię­cej zacho­dzi zmian — szcze­gól­nie przy wyświe­tla­niu dużych par­tii tekstu.

Dodaj arty­kuł 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 wie­dzia­łem, że tak można ;)
    Ale oso­bi­ście czę­ściej uży­wam printf do wyświe­tla­nia tek­stu :)

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

  3. Funk­cja printf jest chyba naj­gor­szym roz­wią­za­niem tj. naj­wol­niej­szym. W zasa­dzie powinno się jej uży­wać tylko pod­czas for­ma­to­wa­nia tekstu.

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

  4. I kolejny nie­świa­domy został oświe­cony. Fak­tycz­nie, o prze­cinku rów­nież nie sły­sza­łem. Dobry spo­sób, dzięki za poda­nie 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 rzu­ca­nie się na te cudzy­sło­wia. Upar­li­ście się ? Do tego uży­wa­nie Apa­che bench jest lek­kim nie­po­ro­zu­mie­niem. Testu­jesz całe środo­wi­sko php i do tego jesz­cze wydaj­ność webser­wera, czy szyb­kość łącze­nia strin­gów ? Zanim wrzu­cisz jakie­goś bench­marka, zasta­nów się może nad tym co za wyniki pre­zen­tu­jesz, co ?

    Poczy­taj może sobie tro­chę http://www.brandonsavage.net/micro-optimizations-that-dont-matter/ (w kwe­sti printf’a włącz­nie, bo Twoje argu­menty w tej kwe­stii też są dość … mało znaczące …)

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

  7. @ivan: arty­kuł ten jest bar­dziej cie­ka­wostką ponie­waż nie każdy wie o tym, że nie trzeba bufo­ro­wać ele­men­tów prze­ka­zy­wa­nych do echo.

    Art­kuł, który pod­rzu­ci­łeś jest praw­dziwy dla­tego, że testy autora ope­ro­wały tylko i wyłącz­nie na tych samych danych które php sobie wrzuca do pamięci cache. Ponadto wyko­rzy­sty­wał on napis z jedną zmienną. Owszem przy two­rze­niu nie­wy­my­sl­nej stronki inter­ne­to­wej róż­nicy nie widać. Zaj­mo­wa­łem się swego czasu pisa­niem par­sera sza­blo­nów i było tam sporo ope­ra­cji na strin­gach. Mogę kie­dyś zro­bić test opie­ra­jący się na gene­ro­wa­niu i łącze­niu loso­wych zna­ków. Wtedy widać, że róż­nica jest ogromna.

    Co wię­cej, dla mnie liczy się odpo­wiedni styl pro­gra­mo­wa­nia a cudzy­sło­wia powo­dują jedy­nie zamie­sza­nie wśród począ­ku­ją­cych — widzia­lem np. kwiatki typu echo „$zmienna“;

    Co do Apa­che Bench­mark — prze­cież napi­sa­ł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