Prawda czy mit - Odwołania statyczne
W poście tym chciałbym obalić jeden z popularnych mitów w programowaniu PHP - mianowicie przekonanie, iż wszelkiego rodzaju wywołania statyczne są bardzo powolne. W celu zbadania efektywności wykonywanie poszczególnych zadań skorzystałem z:
- - PHP 5.2.0 (cli) (built: Nov 2 2006 11:57:36)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies
with Xdebug v2.0.0RC3, Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, by Derick Rethans - - WinCacheGrind 1.0.0.12
Testy zostały przeprowadzone na laptopie Asus M6870Ne (Pentium Mobile 1,8 GHz, 1536MB RAM), poniżej wyniki.
Wbrew powszechnej opinii, jakoby wywołania statyczne były znacznie wolniejsze w większości sytuacji zachowują się zupełnie przeciwnie, aby sprawdzić dokładniej ich zachowanie przeprowadziłem serię testów polegającą na wykonaniu 10000 operacji tego samego typu przy wykorzystaniu odwołań statycznych, oraz obiektów. Aby zniwelować możliwość przekłamania każdy taki test został uruchomiony 10 razy, a wyniki zostały przedstawione na podstawie średniej arytmetycznej przebiegu każdego z testów.
Dodatkowo dla odwołań przy wykorzystaniu obiektów przeprowadzane były dwie serie pomiarowe operujące każdorazowo na tym samym obiekcie, oraz operujące za każdorazowo na nowej instancji klasy.
1. Odczyt i zapis wartości przy wykorzystaniu akcesorów
W tym teście przeprowadziłem pomiar wydajności dostępu do danych przy wykorzystaniu akcesorów.
2. Bezpośrednia zmiana wartości
Testowi poddana została wydajności zmian wartości / odczytu wartości dla bezpośredniego odwołania do właściwości obiektu. Jest to jedyny test którego wyniki przemawiają na korzyść odwołania przy wykorzystaniu obiektów, niemniej jednak wyłącznie przy pracy na jednej instancji klasy.
Test ten w odróżnieniu od pozostałych nie skupia się na zmianie bądź też odczycie wartości zmiennych, jego celem jest porównanie wywołań metod z wykorzystaniem obiektów i odwołań statycznych.
O ile więc porównywanie odwołań statycznych z każdorazowym tworzeniem instancji obiektu nie może być miarodajne, to mimo wszystko przyjęcie takiego założenia wskazuje, iż odwołania statyczne są wolniejsze od odwołań do obiektów tylko w jednej sytuacji. Mowa tutaj o bezpośrednim odwołaniu do właściwości obiekt, co z kolei jest sprzeczne z dobrymi praktykami programistycznymi. Wprawdzie wyniki przeprowadzone zostały na PHP 5.2, jednak wydaje mi się, iż na chwilę obecną rozpatrywanie wcześniejszych wersji niż 5.x mija się z celem.
Przyznam szczerze że o tym jakoby odwołania do obiektów były szybsze od metod statycznych usłyszałem może kilka razy.
Ale ciekawe porównanie.