Archiwum dla Maj, 2009

Optymalizacja PHP: file_exists

08 maja 2009

Funkcja file_exists jest wolna. To fakt niezaprzeczalny, generalnie każde odwołanie PHP do plików/katalogów jest wolne i nie da się tego przeskoczyć.

Z drugiej strony we wszystkich kursach i książkach na temat PHP jesteśmy karmieni ładnymi bloczkami kodu gdzie nieodłącznym elementem jest sprawdzanie czy dany plik istnieje przed pobraniem jego zawartości czy dołączeniem do skryptu.

Co w takim razie robić? Używać czy nie używać file_exists? Odpowiedź brzmi: to zależy.

Jeżeli jakiś plik do którego za chwilę zamierzasz się odwołać pochodzi z niepewnego źródła lub np. pracujesz nad projektem w którym grzebie mnóstwo ludzi lub jeżeli istnieje jakikolwiek inny powód przez który nie masz 100% pewności, że ten plik tam jest to używaj file_exists.

Ale jeżeli sam wgrałeś/wygenerowałeś wcześniej ten plik i wiesz, że on tam jest to, na miłość Boską, nie używaj file_exists tylko dlatego, że tak ładniej i profesjonalniej wygląda! Nie popadaj w skrajności bo wkrótce zaczniesz sprawdzać przed każdym include/require czy interesujący Cię plik jest na dysku.

Pamiętaj, programuj z głową. Czasami trzeba pisać systemy idiotoodporne ale czasami wystarczy napisać kawałek kodu, który wykonuje to i tylko to co od niego oczekujesz, bez zbędnej uniwersalności i wodotrysków.


Optymalizacja PHP: if/elseif/else szybsze od switch/case

06 maja 2009

W każdym kursie, w każdej książce o PHP najpierw opisywana jest funkcjonalność if/elseif/else a potem pokazana jest alternatywa switch/case z komentarzem, że jeżeli mamy kilka następujących po sobie warunków to najlepiej skorzystać właśnie ze switch/case.

A ja na to: gówno prawda! :)

Zaletą konstrukcji switch/case w PHP jest… ładny wygląd :) Taki zapis wygląda na bardziej uporządkowany, w kodzie jest mniejszy zamęt. Niestety opłacamy to wydajnością…

No dobrze dobrze, nie będę przesadzał :) Tak naprawdę to różnice są niewielkie. Przy tysiącu prób warunki if/elseif wykonały się w 2 milisekundy a switch/case w 3 milisekundy. Co ciekawe, użycie w if === zamiast == przyspiesza wykonanie o 4%.

Nie namawiam do porzucenia switch/case. Proszę traktować ten wpis jako ciekawostkę na błahy temat :) Taka odskocznia od poważnych problemów.