Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obiekty, a wydajność
Forum PHP.pl > Forum > PHP > Object-oriented programming
404
Witam!

Przerabiam właśnie sobie kod na obiektowy, no i np. taką funkcję:
  1. function loadSubforums(MySQLi $db, array &$subforums)
  2. {
  3. $stmt = $db->prepare('SELECT * FROM forum_subforums ORDER BY subforumId');
  4. if( $stmt === false )
  5. return false;
  6.  
  7. if( !$stmt->execute() )
  8. return false;
  9.  
  10. if( !$stmt->bind_result($subforumId, $subforumTitle, $subforumDescription) )
  11. return false;
  12.  
  13. while( $stmt->fetch() )
  14. $subforums[] = array($subforumId, $subforumTitle, $subforumDescription);
  15.  
  16. return $stmt->close();
  17. }

...przerobiłem na:
  1. function loadSubforums(MySQLi $db, array &$subforums)
  2. {
  3. $stmt = $db->prepare('SELECT * FROM forum_subforums ORDER BY subforumId');
  4. if( $stmt === false )
  5. return false;
  6.  
  7. if( !$stmt->execute() )
  8. return false;
  9.  
  10. if( !$stmt->bind_result($subforumId, $subforumTitle, $subforumDescription) )
  11. return false;
  12.  
  13. while( $stmt->fetch() )
  14. $subforums[] = new Subforum(NULL, $subforumId, $subforumTitle, $subforumDescription);
  15.  
  16. return $stmt->close();
  17. }

Wszystko ok, ale... dlaczego czas wykonania skryptu wzrósł o 100%? O.o Dla testów umieściłem w bazie ponad dwa tysiące rekordów. Bez obiektów strona wyświetla się w trochę ponad sekundę, a używając klas czas wzrasta do dwóch sekund. Konstruktor klasy Subforum to tylko przypisania.

Z góry dziękuję za odpowiedź.
Orzeszekk
W php5 operator & jest przestarzały w parametrach. tablice są domyślnie przekazywane przez referencję.

Możesz włączyć APC, lub jakiś tam zend optimizer, powinno sporo pomóc, różnica powinna się zmniejszyć. PHP bez optymalizatora opcode ma wolne wywołania metod.

Po za tym pokaż kod obiektu, może w konstruktorze coś namieszałeś i dlatego ci aż tak spowolniło.

Kod obiektowy zawsze ma większy narzut, jednak pozwala ci zrobić w czytelny sposób optymalizacje, bo obiekty myślą same za siebie jeśli je dobrze skonstruujesz. Są odporniejsze na błędy.

Jak będziesz rozwijał ten kod przez parę miesięcy to ten array($costam1, $costam2, $costam3) może cię kosztować sporo nerwów, gdy przez pare godzin będziesz szukał dlaczego coś nie działa (nie masz jak w takim arrayu zrobić walidacji wprowadzanych do niego danych).

Lub nawet gdy będziesz chciał stworzyć sobie nowego takiego arraya, troche sobie poszukasz zanim znajdziesz w jakiej kolejnosci podawać do niego argumenty, i znalezienie ewentualnego błędu związanego z podaniem złych argumentów też zajmie ci troche czasu.

Poza tym, w rzeczywistych sytuacjach, wykorzystując wzorce projektowe, będziesz mógł w łatwy sposób zrobić cache, czy dodatkową warstwę abstrakcji dla bazy danych z której będziesz korzystał tak jakbyś normalnie wczytywał z bazy danych, a ona będzie się "martwiła" czy scachować dany obiekt, czy odczytać go z cache, czy z bazy danych. Kod przyśpieszy, będzie miał mniejszą złożoność obliczeniową, a ty będziesz miał to niejako za darmo.

A jeśli chcesz szybki kod bez narzutu, to zacznij pisać skrypty CGI w C. Tam nie będziesz sie martwił dlaczego kod obiektowy spowolnił 100% tylko będziesz miał problemy typu: dlaczego wpisanie stringa do tablicy powoduje nadpisanie kodu programu, dlaczego wskaźnik nie wskazuje na to na co powinien itp.
-=Peter=-
Cytat
W php5 operator & jest przestarzały w parametrach. tablice są domyślnie przekazywane przez referencję.

Nie wprowadzaj ludzi w błąd jak czegoś nie jesteś pewien! Tablice nie są przekazywane domyślnie przez referencję, a przez wartość. Operator & wcale nie jest przestarzały...
404
Cytat
Po za tym pokaż kod obiektu, może w konstruktorze coś namieszałeś i dlatego ci aż tak spowolniło.

Jak już pisałem - w konstruktorze są same przypisania.

Co do kodu to będę musiał się bardziej postarać. Myślałem już nad czymś takim:
  1. $subforums = new SubforumsLoader;
  2. $subforums->setFields('subforumId', 'subforumTitle');
  3. $subforums->setCondition('subforumState <> 1');
  4. $subforums->load();
  5.  
  6. //...
  7.  
  8. $subforum = $subforums->get(1);
  9. echo $subforum->getTitle();


Jedno tylko mnie zastanawia. W jaki sposób poradzić sobie z nazwami kolumn? Chciałbym żeby następujący kod:
  1. $subforums->setFields('subforumId', 'subforumTitle');]

był równoważny z:
  1. $subforums->setFields('subforumTitle', 'subforumId');]

Równoważny, czyli pola klasy Subforum:
  1. class Subforum
  2. {
  3. private $id,
  4. $title;
  5. //...
  6. };

zawierały poprawne (a nie odwrotne) wartości. Mówiąc krótko - chcę aby kolejność przekazywanych nazw kolumn była zupełnie dowolna. Hm, tablice asocjacyjne?
Orzeszekk
Cytat(-=Peter=- @ 15.01.2012, 18:40:08 ) *
Nie wprowadzaj ludzi w błąd jak czegoś nie jesteś pewien! Tablice nie są przekazywane domyślnie przez referencję, a przez wartość. Operator & wcale nie jest przestarzały...


tak , faktycznie tablice lecą przez wartość. zmyliło mnie to E_NOTIFY ktore sie czasami pojawia gdy użyje się tego operatora & "passing objects by reference is deprecated"
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.