2012-10-19 5 views
18

Pracuję nad aplikacją internetową, która wyświetla dziesiątki równoczesnych użytkowników na sekundę. Mam klasę, która będzie instancjonowana wiele razy w ramach tego samego ładowania strony. W tej klasie mam pewne właściwości, które zawsze będą takie same dla każdego obiektu, więc myślę o deklarowaniu tych właściwości jako static w celu zmniejszenia ilości pamięci, która będzie używana, gdy wiele instancji tej klasy zostanie utworzonych podczas to samo żądanie strony.Czy korzystanie ze statycznych metod i właściwości w PHP wymaga mniej pamięci?

Czy to spowoduje mniej pamięci dla tej aplikacji, ponieważ PHP może przechowywać wartość właściwości statycznych tylko raz? Czy to pozwoli zaoszczędzić pamięć użytkownikom współbieżnym lub tylko w ramach każdego procesu PHP?

Jak to działa w przypadku metod? Jeśli oznacza to, że obiekty mogą przetwarzać te same metody, to dlaczego wszystkie metody klasy nie mogą być uznane za statyczne, jeśli próbujesz zapisać w pamięci?

Nie czuję się całkowicie komfortowo z tym, dlaczego i kiedy należałoby zadeklarować nieruchomość lub metodę statyczną, ale rozumiem, że deklarowanie ich jako statycznych umożliwia dostęp do nich bez tworzenia obiektu klasy (to wydaje się być hack ... te metody i właściwości powinny być gdzie indziej ... nie?). Interesuje mnie sposób, w jaki deklaracja static wpływa na użycie pamięci, aby ograniczyć obciążenie pamięci na moim serwerze sieciowym ... i ogólnie, aby lepiej zrozumieć, co się dzieje.

+5

Nie rozumiem, dlaczego zostało to zamknięte. Pytanie jest bardzo szczegółowe i na pewno istnieje dokładna i niepodważalna odpowiedź. –

+0

Naprawdę dobre i dokładne pytanie, ale chcę zwrócić uwagę na widoczność funkcji w PHP (która wywodzi się z OOP) dla pytania twojego "_Jeśli to oznacza, że ​​obiekty mogą przetwarzać te same metody, to dlaczego nie wszystkie metody klasa może zostać uznana za statyczną, jeśli próbujesz oszczędzać na pamięci? ". Istnieją funkcje MOGĄ być statyczne, a funkcje NIE MUSZĄ być statyczne - te, które pobierają/ustawiają zmienne klasy, które zależą od procedury inicjalizacji klasy. Głównym ograniczeniem jest ten obiekt (instancję), z którym mamy do czynienia w tym czasie. – ozanmuyes

Odpowiedz

15

Po zadeklarowaniu metody/zmiennej klasy jako statycznej, jest ona związana i dzielona przez klasę, a nie obiekt. Z perspektywy zarządzania pamięcią oznacza to, że kiedy definicja klasy jest ładowana do pamięci sterty, te statyczne obiekty są tam tworzone. Gdy rzeczywisty obiekt klasy zostanie utworzony w pamięci stosu, a aktualizacje właściwości statycznych zostaną wykonane, wskaźnik do sterty zawierającej obiekt statyczny zostanie zaktualizowany. Pomaga to zmniejszyć pamięć, ale nie o wiele.

Z paradygmatu programowania ludzie zwykle decydują się używać zmiennych statycznych dla korzyści architektonicznych bardziej niż optymalizacji zarządzania pamięcią. Innymi słowy, można stworzyć zmienne statyczne, takie jak wspomniałeś, kiedy chcesz zaimplementować singleton lub wzór fabryczny. Dostarcza mocniejszych sposobów na poznanie tego, co dzieje się na poziomie "klasy", w przeciwieństwie do tego, co dzieje się na poziomie "obiektu".

4

Czy używanie metod statycznych i właściwości w PHP wymaga mniej pamięci?

Prawdopodobnie. Ale dlaczego miałbyś mieszać się z architekturą OOP?

Czy to ma znaczenie?

Prawdopodobnie nie. To, co wymaga pamięci, to sam PHP. Zdecydowanie uważam, że usunięcie kilku bajtów, ponieważ używasz statycznych metod, nie będzie miało znaczenia. Zamiast tego nie ładuj niepotrzebnych modułów. Np jeśli nie używasz GD, nie ładuj go. Aktywuj buforowanie, aby zmniejszyć liczbę wywołań PHP.

+0

Istnieje kilka dobrych sugestii, szczególnie zmniejszając to, co ładuję w PHP. Dzięki. –

+0

@ T.BrianJones Oczywiście, że mógłbym to rozwinąć, ale wykracza to poza zakres twojego pytania. Ale możesz badać APC, memcache, ... – Tchoupi

+0

@MathieuImbert: czy możesz wyjaśnić, kiedy mówisz "jeśli nie używasz GD, nie ładuj go". Czy chcesz nie ładować go na wszystkie rozszerzenia GD w konfiguracji 'php.ini'? –

1

Wywołania metod statycznych są szybsze w wielu iteracjach, ale metody statyczne tak naprawdę nie oszczędzają pamięci.

Jeśli zadeklarowana klasa nie ma żadnych właściwości, które muszą być unikalne dla każdej instancji obiektu, można zadeklarować każdą metodę i właściwość jako statyczne. Jeśli jednak masz właściwości, które muszą być związane z każdym obiektem, wówczas metody statyczne nie są pomocne. Powodem jest to, że wewnątrz metod statycznych nie ma odniesienia do $this, więc nie można odwoływać się do właściwości obiektu z metod statycznych.

Czytaj na temat Static Keyword, aby lepiej to zrozumieć.

+1

W rzeczywistości normalne metody są szybsze (i podejrzewam, że użycie pamięci może mieć podobną korelację). Dodatkowy koszt dotyczy utworzenia obiektu. Zasadniczo, jeśli wykonujesz więcej niż 4 metody na tym samym obiekcie, wówczas całkowite użycie obiektu staje się bardziej czasochłonne. Istnieje również ta drobna rzecz, w której normalne metody to OOP (z całym tym BS o polimorfizmie i iniekcji zależności) oraz statyczne metody będące częścią paradygmatu programowania proceduralnego. –

0

Nie jestem ekspertem od zarządzania pamięcią PHP, ale powiedziałbym, że NIE oszczędzasz dużo. Jeśli i ile zaoszczędzasz zależy od pewnych aspektów:

  • Rozmiar obiektu (podczas tworzenia instancji, ile innych danych zatrzymuje obiekt).
  • Liczba tworzonych obiektów.

Zwłaszcza liczba obiektów jest ważna. Jeśli masz tylko jedno wystąpienie, oszczędzasz 50%. W takim przypadku:

Przypadek A - Statyczny: nie tworzy się instancji obiektu, ale należy użyć definicji klasy, która jest przechowywana w pamięci. Ale definicja klasy jest ładowana dla każdego ŻĄDANIA, co oznacza, że ​​masz taką samą ilość definicji klas w pamięci, ile masz równoczesnych żądań.

Przypadek B - Instancje: Oprócz przypadku A masz również instancję tego obiektu dla każdego żądania, co zwiększa dwukrotnie zużycie pamięci dla tej części oprogramowania.

Wreszcie: jeśli łatwiej jest pracować z parametrami statycznymi zamiast tworzyć instancję za każdym razem, powinieneś pójść statycznie. Ale nie oczekuj zbyt dużego zwiększenia pamięci.

6

Spójrz statyczne vs testów pojedynczych: http://moisadoru.wordpress.com/2010/03/02/static-call-versus-singleton-call-in-php/

Uwaga: z jakichś powodów, stackoverflow nie wykazały multilne temat, więc jestem dodanie obrazu.

Number of runs Singleton call time (s)  Static call time (s) 
100    0.004005     0.001511 
1,000   0.018872     0.014552 
10,000   0.174744     0.141820 
100,000   1.643465     1.431564 
200,000   3.277334     2.812432 
300,000   5.079388     4.419048 
500,000   8.086555     6.841494 
1,000,000  16.189018     13.696728 

Zamówienie więcej szczegółów tutaj: https://stackoverflow.com/a/3419411/260080

+0

Właściwość, która jest zadeklarowana jako statyczna, może być dostępna w instancji klasy obiektu - wypróbuj ją: – raidenace

+0

Prawda. Erm, to jest z php.net. Próbowałem, ale dlaczego jest tam udokumentowany, nie wiedziałem. –

+0

Spróbuj jeszcze raz :-) – raidenace

-1

Jeśli udostępniasz dane używać statycznego. Jest szybszy i oszczędza proces tworzenia obiektu. Singletons wygrywają w porównaniu ze statystyką, gdy potrzebujesz pojedynczego punktu wejścia. Omówiłem to na moim blogu około 1 tygodnia temu.

+0

Dzięki za wyjaśnienie Pauly. Czy się myliłem? Czy bezwstydnie promowałem moją komercyjną stronę internetową? Pauly sprawia, że ​​TAK jest lepszym miejscem! – CodeAngry

Powiązane problemy