![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 260 Pomógł: 14 Dołączył: 8.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Wrzucam benchmark, moze komus sie przyda, jak juz jest taki to skasujcie.
Stale czy zmienne? Chcialem napisac lang system, ale postanowilem sprawdzic przed napisaniem co jest szybsze, zeby nie bylo placzu. Wyniki uzyskalem uzywajac profilera XDebug i programu WinCacheGrind. Testy byly powtarzane kilka razy, co prawda nie chcialo mi sie liczyc sredniego czasu, ale upewnilem sie ze absurdalny wynik nie został spowodowany jakims bledem czy chociazby zmiennym obciazeniem procka (za kazdym razem wychodzi podobnie) Mówiąc zmienne mam na myśli globalną tablice asocjacyjną, cos w stylu lang['komunikat_odebrano_plik']='odebrano plik'; Prędkośc tworzenia w sytuacji gdy nazwy są posortowane nazwa1, nazwa2, nazwa3...: Stałe: Tworzenie funkcją define 2000 razy: 33ms Zmienne: Zapis do tablicy asocjacyjnej 2000 razy: 4,0ms Jak widać tablica asocjacyjna przy tworzeniu jest szybsza ok 9-10 razy. Uwaga: gdy losowo dodawałem do indeksu liczbe z zakresu (1-4000) przed prawdziwym indeksem, aby zasymulowac dodawanie nieposortowanych stałych tak jak to bedzie mialo miejsce w rzeczywistosci (dodanie stałych _komunikat_skryptu, _daj_pieniadze, _zamknij_ryj jest wlasnie przykladem dodania nieposortowanych stałych: k>d, d<z), wydajnosc tablic asocjacyjnych spada w stosunku do stałych Prędkośc tworzenia w sytuacji gdy do nazwy dodaje losowo znak - przed cyfrą: Stałe: Tworzenie funkcją define 2000 razy: 80ms Zmienne: Zapis do tablicy asocjacyjnej 2000 razy: 42ms. Różnica spadła do 2 razy... Tablice asocjacyjne spowolnily sie 10 razy w stosunku do posortowanego przypadku, ale czas wykonania wynosi aż 80/40ms czyli używając tablic asocjacyjnych zaoszczędzamy aż 40ms. Ta roznica nadal wynosi 2 razy, nawet jeśli utworzymy 20 tys wpisów (713/445 ms) Podejrzewam ze tablice asocjacyjne są sortowane aby zapewnic wieksza predkosc odczytu (do posortowanych tablic mozna zastosowac alg. wyszukiwania binarnego lub interpolacyjnego ktory ma czas logarytmiczny a nie liniowy). Do tablic pewnie tez cos takiego sie stosuje tylko tablica stałych jest globalna dla wszystkich stałych i z tego ma wiecej wpisow i jest znacznie wolniejsza (czas takiego sortowania przy dodaniu nowego itemu rosnie liniowo wraz z iloscia wpisow). Prędkość odczytu: Zrobiłem 2 testy, jeden dla funkcji constant, a drugi dla normalnego dostępu przez nazwe stałej np echo nazwa_stalej; Stałe: Odczyt funkcją constant 2000 razy: 72ms Zmienne: Odczyt z tablicy asocjacyjnej 2000 razy: 8,0ms Znowu tablica asocjacyjna jest szybsza o około 9-10 razy Drugi test: z uzyciem nazwy stałej Stałe Odczyt za pomoca nazwy stałej 2000razy: 32ms Zmienne odczyt tablicy asocjacyjnej 2000 razy: 10ms Tutaj tablica asocjacyjna jest szybsza tylko 3 razy. Wnioski Stałe są sporo wolniejsze od zmiennych. Przy tworzeniu systemu języka ma to jakies znaczenie, w końcu może on sięgnąć 2000 wpisów i więcej, a odczytów w takim systemie będzie zawsze sporo mniej niż zapisów (trzeba utworzyc wszystkie stałe, a odczytamy tylko część z nich). Niewątpliwie na korzyść stałych przemawia wygoda: np w pakiecie eclipse po najechaniu mychą na nazwe stałej wyświetli nam sie jej zawartosc, co moze pomoc w debugowaniu czy ogólnie zorientowaniu się w treści skryptu, no i nie trzeba pisac za kazdym razem global $lang gdy chcemy w jakiejs procedurze uzyc jezyka. Na małej stronie znajdzie sie około 300 pozycji więc przeliczylem tez dla takiej ilosci: tworzenie 300 stałych funkcja define: 16ms tworzenie 300 indeksow w tablicy asocjacyjnej: 5,4ms Odczytu nie sprawdzalem gdyz jest on pomijalny: przy kazdym wywolaniu skryptu utworze 300 stalych/zmiennych a odczytam tylko 20. Ponieważ moja strona zawiera (jak zwrocilo mi wyszukiwanie) 1500 stringow, z czego polowe moge odrzucic bo to pewnie jakies stringi sql albo sterujace czyms, a polowa to labele zawierajace napisy przeznaczone dla uzytkownika, mam roznice ok 20 ms w czasie generowania strony stałe/zmienne. Poniewaz moze mi jeszcze przybyc tych wpisów, ja chyba zdecyduje sie na tablice asocjacyjną zeby pozniej nie bylo placzu. Kod benchmarka:
Ten post edytował Orzeszekk 18.10.2011, 15:29:35 -------------------- "The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 13:15 |