Autor wpisu: Michał Środek, dodany: 26.09.2009 13:21, tagi: php
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
Kanał ATOM

Tak więc przyszedł czas by omówić klasę dispatcher’a (dyspozytora), jest to pewien wzorzec projektowy, dzięki któremu będziemy mogli zarządzać zdarzeniami. Tak projektowanie oparte na zdarzeniach, jak pewnie łatwo jest się Wam domyślić, gdy piszę o zdarzeniach myślę o przesyłanych przez url get’ach. Kiedy nasza fantazja prowadzi nas ku lepszym i co raz to abstrakcyjnym rozwiązaniom, będziemy mieli umysł otwarty na nowe być może lepsze oraz na pewno ciekawe rozwiązania.