PHP: Je rychlejší singleton nebo statická třída?
Nálepky:
Singleton patří bez nadsázky k jednomu z nejpopulárnějších návrhových vzorů; je velmi snadno pochopitelný a implementovatelný i v jazycích, kde objektová podpora není nijak extra mocná, jako např. v PHP. Leckdy se jimi ale řeší i věci, kde by bylo vhodnější použít jinou jazykovou konstrukci, například statickou třídu. Doru Moisa se zaměřil na srovnání singletonu a statické třídy z hlediska rychlosti volání. Svá měření shrnul v článku Static Call versus Singleton Call in PHP.
Myslím, že nejlepší je rozhodovat se podle toho, co se tam logicky nejlépe hodí a ne podle toho, co je v současné implementaci s konkrétní konfigurací momentálně trošku výkonnější. Pokud programátor řeší výkon mimo kompilátory apod., nemělo by to IMHO obvykle (bez zvláštních důvodů) příliš přesáhnout řešení asymptotické složitosti. Rozhodně bych neřešil takové… ptákoviny. Zítra někdo napíše nějakou optimalizaci na Singletony nebo někdo nasadí nějaký php optimizer, HPHP nebo podobně, najednou bude vše jinak a já budu vše přepisovat? Ne, nejsem cvičená opice.
Vizte také podobný postoj: http://blog.krecan.net/2010/02/02/slava-abstrakci/
Řekl bych, že nejsme v rozporu – píšu „Leckdy se jimi ale řeší i věci, kde by bylo vhodnější použít jinou jazykovou konstrukci, například statickou třídu.“ V odkázaném článku je i srovnání výkonu v hphp. Samosebou je správné použít singleton tam, kde má být singleton, a statickou třídu tam, kde má být statická třída. Článek je spíš mířen na vývojáře, kteří bezhlavě používají singleton (je to přeci „ten návrhový vzor“) i tam, kde není vhodný. Každopádně bez ohledu na podobné zlozvyky je zajímavé i to srovnání rychlosti samo o sobě – leckteří vývojáři ani netuší, že tam nějaká režie je.
Samozřejmě, vše záleží na správné interpretaci. Konkrétně o HPHP nejde, jde mi spíš obecně o přístup „Zítra nasadíme toto a výkon může být jinde.“.
Určité odůvodnění mohou mít jak „statické třídy“*, Singleton, tak i Dependency Injection.
*) Tento pojem trošku koliduje se stejným pojmem v Javě, ale, myslím, víme, o čem mluvíme.