Jak mogę powiedzieć, która klasa z wielu (z których wszystkie wykonują tę samą pracę) wykonuje się szybciej? czy jest oprogramowanie do pomiaru tego?
źródło
Jak mogę powiedzieć, która klasa z wielu (z których wszystkie wykonują tę samą pracę) wykonuje się szybciej? czy jest oprogramowanie do pomiaru tego?
Masz (przynajmniej) dwa rozwiązania:
Dość „naiwny” używa mikrotime (true) przed i po części kodu, aby sprawdzić, ile czasu minęło podczas jego wykonania; inne odpowiedzi mówiły to i już dawały przykłady, więc nie powiem więcej.
To dobre rozwiązanie, jeśli chcesz porównać kilka instrukcji; na przykład porównać dwa typy funkcji - lepiej zrobić to tysiące razy, aby upewnić się, że każdy „element zakłócający” jest uśredniony.
Coś takiego, więc jeśli chcesz wiedzieć, ile czasu zajmuje serializacja tablicy:
$before = microtime(true);
for ($i=0 ; $i<100000 ; $i++) {
serialize($list);
}
$after = microtime(true);
echo ($after-$before)/$i . " sec/serialize\n";
Nie jest idealny, ale przydatny, a jego konfiguracja nie zajmuje dużo czasu.
Innym rozwiązaniem, które działa całkiem nieźle, jeśli chcesz zidentyfikować, która funkcja zajmuje dużo czasu w całym skrypcie, jest użycie:
Aby uzyskać pliki profilowania, musisz zainstalować i skonfigurować Xdebug; spójrz na profilowanie skryptów PHP w dokumentacji.
Zwykle nie włączam profilera domyślnie (generuje dość duże pliki i spowalnia działanie) , ale korzystam z możliwości przesłania parametru o nazwie XDEBUG_PROFILE
GET data, aby aktywować profilowanie tylko dla potrzebnej strony.
Część mojego php.ini związana z profilowaniem wygląda następująco:
xdebug.profiler_enable = 0 ; Profiling not activated by default
xdebug.profiler_enable_trigger = 1 ; Profiling activated when requested by the GET parameter
xdebug.profiler_output_dir = /tmp/ouput_directory
xdebug.profiler_output_name = files_names
(Przeczytaj dokumentację, aby uzyskać więcej informacji)
Ten zrzut ekranu pochodzi z programu C ++ w KcacheGrind: (źródło: sourceforge.net ) Otrzymasz dokładnie to samo ze skryptami PHP ;-)
(Mam na myśli KCacheGrind; WinCacheGrind nie jest tak dobry jak KCacheGrind ... )
To pozwala uzyskać widok piękny, co wymaga czasu w aplikacji - i to czasem zdecydowanie pomaga zlokalizować funkcję, która spowalnia wszystko w dół ^^
Zauważ, że Xdebug zlicza czas procesora spędzony przez PHP; kiedy PHP czeka na odpowiedź z bazy danych (na przykład), nie działa; tylko czekam. Więc Xdebug pomyśli, że żądanie DB nie zajmie dużo czasu!
Powinno to być sprofilowane na serwerze SQL, a nie w PHP, więc ...
Mam nadzieję, że to jest pomocne :-)
Miłej zabawy!
Dla szybkich rzeczy robię to (w PHP):
Możesz także użyć programu profilującego, takiego jak http://xdebug.org/ .
źródło
Zrobiłem prostą klasę pomiaru czasu, może komuś się przyda:
Posługiwać się:
źródło
echo
$echo
Aktualizacja 2020
Minęło wiele lat, odkąd ostatnio odpowiedziałem na to pytanie, więc pomyślałem, że zasługuje na aktualizację w krajobrazie APM.
Pierwotnie odpowiedział w październiku 2015
Oto bezpośrednia odpowiedź na Twoje pytanie
Tak jest. Zastanawiam się, dlaczego nikt jeszcze o tym nie wspomniał. Chociaż odpowiedzi sugerowane powyżej wydają się w porządku do szybkiego sprawdzenia, ale nie są skalowalne na dłuższą metę lub dla większego projektu.
Dlaczego nie skorzystać z narzędzia do monitorowania wydajności aplikacji (APM), które zostało stworzone specjalnie do tego i nie tylko. Sprawdź NewRelic, AppDynamics, Ruxit (wszystkie mają bezpłatną wersję), aby monitorować czas wykonania, wykorzystanie zasobów, przepustowość każdej aplikacji do poziomu metody.
źródło
Jeśli chcesz szybko przetestować wydajność frameworka, możesz umieścić go w pliku index.php
Za każdym razem otrzymasz czas wykonania w milisekundach . Ponieważ mikrosekundy nie są zbyt przydatne w testowaniu przypadku struktury.
źródło
Ostatnio korzystam z XHProf http://pecl.php.net/package/xhprof . Został pierwotnie opracowany przez Facebooka i ma przyzwoity interfejs internetowy.
źródło
Chciałbym podzielić się z wami własną funkcją, której używam do pomiaru szybkości dowolnej istniejącej funkcji do 10 argumentów:
Przykład
Zwroty
źródło
Jeśli jest to coś, co można przetestować poza kontekstem WWW, po prostu używam
time
polecenia Unix .źródło
Zend Studio ma wbudowaną obsługę profilowania przy użyciu XDebug lub ZendDebugger. Sprofiluje Twój kod, informując dokładnie, ile czasu zajęła każda funkcja. To fantastyczne narzędzie do ustalania, gdzie są Twoje wąskie gardła.
źródło
Możesz użyć podstawowych rzeczy, takich jak przechowywanie znaczników czasu lub mikrotime () przed i po operacji, aby obliczyć potrzebny czas. To łatwe, ale niezbyt dokładne. Może lepszym rozwiązaniem jest Xdebug , nigdy z nim nie pracowałem, ale wydaje się, że jest to najbardziej znany debugger / profiler PHP, jaki mogę znaleźć.
źródło