Mimo, że jego stosowanie nie jest do końca poprawne, to korzysta z niego praktycznie każdy znany mi programista. Mowa o wzorcu projektowym Singleton. Możemy go zaimplementować na wiele sposobów, ale który jest najszybszy?
Klasa Singleton1 to najczęściej spotykana implementacja - jest przejrzysta i logiczna, natomiast klasa Singleton2 to jej jeszcze bardziej elegancka wersja (niestety rzadko spotykana). Często spotyka się implementację podobną do Singleton3. Na oko wygląda na szybszą z powodu użycia operatora ternarnego, który, w moim subiektywnym odczuciu, nieco zaburza czytelność kodu w tym wypadku. Ostatnia implementacja umożliwia dziedziczenie po klasie Singleton4 z zachowaniem jej funkcjonalności, niestety kosztem złożoności kodu.
Kod
Funkcja testująca dostępna tutaj: benchmark.php
Wyniki
Wyniki są zaskakujące, ponieważ najszybsza okazuje się implementacja z if-em! Ale koniecznie z lokalnie zdefiniowaną zmienną statyczną. Lecz jest ona szybsza od najszybszej wersji z operatorem ternarnym, która jest powszechnie uznawana za szybszą, tylko o niecały procent. Jej wolniejsza wersja również jest szybsza.
A zatem obaliliśmy mit o wyższości operatora ternarnego nad if-em w tym przypadku. Dodatkowo pokazaliśmy, że spadek wydajności nie tkwi wyłącznie w sposobie sprawdzania wartości zmiennej instance, ale również w miejscu deklaracji tej zmiennej.
PS. W deklaracjach klas świadomie pominąłem inne ważne elementy implementacji wzorca Singleton (jak chociażby prywatny konstruktor i metoda clone itp.).
Brak komentarzy:
Prześlij komentarz