2011-10-14 15 views
21

Moja obecna aplikacja internetowa używa około 30 obiektów Contents (DEFINE()). Czytam rzeczy, które zmienne są szybsze. Pod warunkiem, że istnieje konwencja nazewnictwa, aby uniknąć nadpisywania zmiennych, jedyną inną wadą, którą widzę, jest to, że zmienne te musiałyby być zdefiniowane jako zmienne globalne, jak w każdej funkcji.Który jest szybszy? Stałe, zmienne lub zmienne tablice

Który jest szybszy? Używam tych stałych dużo w całej mojej aplikacji i prawdopodobnie będę na zawsze dodawać więcej do listy i są one używane w i poza funkcjami i klasami.

+15

"Przedwczesna optymalizacja jest źródłem wszelkiego zła". Powiedz mi, jeśli potrafisz _zmienić_ jakąkolwiek różnicę;) – KingCrunch

+4

Oszczędność czasu jest tak mała, że ​​nie jest to warte rozważenia. –

+0

kiedy warto tę optymalizację? Czy za każdym razem, gdy odwołujesz się do stałej, jest koszt? I czy jest to więcej, niż gdy odwołujesz się do zmiennej? te 30 stałych są wartościami odniesienia 100 na każdej stronie. – David

Odpowiedz

23

Stałe zdefiniowane przy użyciu define() są dość powolne w PHP. Ludzie faktycznie pisali rozszerzenia (takie jak hidef), aby poprawić wydajność.

Ale jeśli nie masz wielu stałych, nie powinno to mieć większego znaczenia.

Od PHP 5.3 można również używać stałych kompilujących przy użyciu const NAME = VALUE;. Są znacznie szybsze.

+4

Jaka byłaby twoja definicja ładunków? Mam około 30, które są przywoływane 100 razy na stronę – David

+1

@David 30 to niewiele. Problemy mogą powstać tylko przy setkach stałych. – NikiC

11

Różnica byłaby naprawdę mała (mikrooptymalizacje). Lepiej hermetyzuj niektóre ze stałych w klasach, aby uzyskać do nich dostęp poprzez Classname::CONSTANT, aby nie zanieczyszczać globalnej przestrzeni nazw aplikacji.

-1

Nie mogę sobie również wyobrazić, że jakakolwiek różnica prędkości byłaby konsekwencją. Prawdą jest, że zmienne są w wielu przypadkach łatwiejsze w użyciu niż stałe.

Wygląda na to, że twoim problemem jest to, że masz masę danych konfiguracyjnych i chcesz uniknąć przekazywania wielu zmiennych do funkcji lub musisz je wszystkie globalnie.

Nie ma jednej odpowiedzi, która działa dla wszystkich, ale popularnym rozwiązaniem jest użycie klasy rejestru lub utworzenie jej samodzielnie. Możesz to zrobić całkiem łatwo, deklarując tablicę php. Następnie zainicjujesz obiekt rejestru, a twoje funkcje i klasy uzyskają do niego dostęp za pomocą statycznego wywołania metody. Zamiast podawać fragmenty, po prostu polecam jako przykłady przykłady zend_config i zend_registry. Podczas gdy ZF zapewnia takie, nie powinieneś się obawiać, że użyjesz własnych wersji, ponieważ nie jest to szczególnie trudne do odtworzenia w prostszej formie, jeśli chcesz uniknąć użycia ZF w projekcie.

7

Szybki test wykazał, że określające stałe (define('FOO', 'bar');) wynosi około 16 do 18 razy wolniej niż określenie zmiennej ($foo = 'bar';), ale przy użyciu zdefiniowanego (stała) jest około 4 do 6 razy szybsza.

Powiązane problemy