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
Z doświadczenia wiem, że programiści dzielą się na dwie grupy: tych co będą szukać optymalizacji na kazdym kroku oraz tych, którzy wolą dokupić dodatkową kość RAM i wyspać się zamiast pracować do późna w nocy
. Ja oczywiście należę do tej pierwszej. Już samo użycie php nie jest najoptymalniejszym rozwiązaniem, lecz od czasu do czasu postaram się opisać w kilku słowach jak przyspieszyć 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'; |
Sposób działania jest prosty. Podczas użycia cudzysłowów ciąg znaków jest przeszukiwany w pod kątem posiadania jakichś zmiennych. Tutaj one istnieją więc skrypt podstawia pod $cat ciąg znaków Mruczek. Następnie wyrzuca na wyjście gotowy napis. W przypadku użycia apostrofów jest troszkę inaczej. PHP nie wyszukuje żadnych zmiennych ponieważ ma jasno określone miejsce w którym te zmienne się znajdują, co sprawia, że całość działa czasami nawet kilkukrotnie szybciej.
Czy dałoby się to jeszcze bardziej przyspieszyć? Oczywiście
. Wystarczy posłużyć się operatorem przecinka zamiast kropki.
4 | echo 'Mój kot ma na imię ',$cat,' i jest zawsze wesoły'; |
Większość programistów o tym nie wie ale w przypadku operatora kropki, PHP najpierw tworzy wynikowy ciąg znaków co powoduje dodatkowe obciążenie pamięci. Przy dwóch kropkach 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 przecinków, PHP po prostu będzie każdy z elementów interpretował jak kolejne parametry(choć pamiętajmy — echo nie jest funkcją!) i wyrzucał je bezpośrednio na wyjście. Pytanie: czy opłaca się buforować wyjście za pomocą kropki(np. w przypadku długiego czasu dostępu do wyjścia)? To już pozostawiam wam do przemyśleń. Poniżej testy prędkości przy użyciu Apache Benchmark:
Wersja 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)
Wersja 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)
Wersja z przecinkiem:
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ż kombinował w gnuplocie aby stworzyć ładne wykresy, ale na oko widać, że wersja z przecinkiem sprawuje się najlepiej. Oczywiście wyniki należy przyjąć z lekkim przymrużeniem oka ponieważ Apache Benchmark najlepszym narzędziem nie jest. Warto również uruchomić dobre oprogramowanie do monitorowania pamięci RAM, bo to tam najwięcej zachodzi zmian — szczególnie przy wyświetlaniu dużych partii tekstu.
Kanał RSS z komentarzami do tego wpisu. Adres URL dla TrackBacków
Cwane
Tego z przecinkami nie znałem
Komentarz - autor: Michał Molenda — 29 września 2009, 12:18
No ja też muszę przyznać, że nie wiedziałem, że tak można
Ale osobiście częściej używam printf do wyświetlania tekstu
Komentarz - autor: Aenigmatis — 30 września 2009, 11:10
Funkcja printf jest chyba najgorszym rozwiązaniem tj. najwolniejszym. W zasadzie powinno się jej używać tylko podczas formatowania tekstu.
Komentarz - autor: Michał Środek — 6 października 2009, 16:06
I kolejny nieświadomy został oświecony. Faktycznie, o przecinku również nie słyszałem. Dobry sposób, dzięki za podanie jego
Komentarz - autor: blk — 17 października 2009, 11:51
A ja sie nie zgodze…
Komentarz - autor: johny-max — 25 listopada 2009, 10:32
Kolejny post o mikro-optymalizacjach. I znów rzucanie się na te cudzysłowia. Uparliście się ? Do tego używanie Apache bench jest lekkim nieporozumieniem. Testujesz całe środowisko php i do tego jeszcze wydajność webserwera, czy szybkość łączenia stringów ? Zanim wrzucisz jakiegoś benchmarka, zastanów się może nad tym co za wyniki prezentujesz, co ?
Poczytaj może sobie trochę http://www.brandonsavage.net/micro-optimizations-that-dont-matter/ (w kwesti printf’a włącznie, bo Twoje argumenty w tej kwestii też są dość … mało znaczące …)
Komentarz - autor: ivan — 25 listopada 2009, 23:34
@ivan: artykuł ten jest bardziej ciekawostką ponieważ nie każdy wie o tym, że nie trzeba buforować elementów przekazywanych do echo.
Artkuł, który podrzuciłeś jest prawdziwy dlatego, że testy autora operowały tylko i wyłącznie na tych samych danych które php sobie wrzuca do pamięci cache. Ponadto wykorzystywał on napis z jedną zmienną. Owszem przy tworzeniu niewymyslnej stronki internetowej różnicy nie widać. Zajmowałem się swego czasu pisaniem parsera szablonów i było tam sporo operacji na stringach. 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 Benchmark — przecież napisałem, że ten test nie jest do końca miarodajny.
Komentarz - autor: Michał Środek — 26 listopada 2009, 0:24