2008-11-19 12 views
25

dla konkretnego segmentu kodu Java, chciałbym zmierzyć:Mierzenie czasu wykonania, użycie pamięci Java i obciążenie procesora dla segmentu kodu

  • czas wykonywania (najprawdopodobniej czas realizacji wątek)
  • użycie pamięci
  • obciążenie procesora (konkretnie przypisane do segmentu kodu)

Jestem względną nowicjuszką w Javie i nie wiem, jak można to osiągnąć. Zostałem skierowany do JMX, jednak nie jestem pewien, w jaki sposób można go użyć, a JMX wygląda trochę "ciężko" na to, co chcę zrobić.

Idealnie chciałbym niektórych klasy pomiarowej, które można powiedzieć, co chciałbym zmierzyć, z możliwością wywołania metody start() przed segmentem kodu i po stop() metoda. Istotne dane zostaną zarejestrowane w pliku, który podaję.

Na przykład:

import com.example.metricLogger; 

metricLogger logger = new metricLogger(); 

logger.setLogPath(pathToLogFile); 
logger.monitor(executionTime); 
logger.monitor(memoryUsage); 
logger.monitor(cpuLoad); 

logger.start(); 

/* Code to be measured */ 

logger.stop(); 

Czy istnieje jakiś standard/common/konwencjonalnym sposobem osiągnięcia tego celu w Java?

Takie pomiary służą do jednorazowych porównań wydajności, dlatego nie szukam żadnych długotrwałych procesów monitorowania w trakcie produkcji.

Jestem bardziej niż szczęśliwy, mogąc być odsyłanym do samouczków lub przykładów zewnętrznych i nie oczekuję pełnej odpowiedzi tutaj. To powiedziawszy, jeśli można osiągnąć coś tak prostego, jak powyższe, realistyczny przykład mógłby się bardzo dobrze skończyć.

Odpowiedz

19

Profilowanie może być łatwiejszą opcją, ponieważ nie wymaga statystyk dotyczących produkcji. Profilowanie również nie wymaga modyfikacji kodu. VisualVM (który jest dostarczany z JDK 1.6.06+) jest prostym narzędziem. Jeśli chcesz czegoś bardziej dogłębnego, pójdę z Eclipse TPTP, profiler Netbeans lub JProfiler (pay).

Jeśli chcesz napisać jesteś właścicielem, należy rozważyć następujące kwestie:

Proste pomiary takie jak czas wykonania może być wykonane przez „podkręcanie” sekcja jesteś zainteresowany:

long start = System.nanoTime(); // requires java 1.5 
// Segment to monitor 
double elapsedTimeInSec = (System.nanoTime() - start) * 1.0e-9; 

Można wykorzystać podobna technika monitorowania pamięci za pomocą metod Runtime.getRuntime(). * memory(). Należy pamiętać, że śledzenie użycia pamięci w środowisku gromadzenia śmieci jest trudniejsze niż proste odejmowanie.

obciążenie procesora jest trudne do zmierzenia w Javie, ja zwykle trzymać się czasu realizacji i optymalizacji dłuższe/sekcje powtarzające

+4

Wyniki pomiarów mogą obejmować czas czyszczenia pamięci, czas spędzony w kompilatorze JIT, czas spędzony w systemie operacyjnym z powodu innych procesów czas spędzony przez inne procesy lub czas wykonania "segmentu do monitorowania" może wynosić dwa rzędy o mniej niż czas na wywołanie 'nanoTime()'. Tylko dlatego, że 'nanoTime()' zwraca nano sekund nie oznacza, że ​​rozdzielczość jest tak wysoka. – jmg

+0

OP również poprosił o zmierzenie użycia pamięci. Czy te profilery mogą to zmierzyć? (Podejrzewam, że nie) – Raedwald

1

Korzystanie Java Profiler jest najlepszym rozwiązaniem, a to daje cały wgląd, który Cię potrzeba do kodu. viz Czasy odpowiedzi, wątki CallTraces, wykorzystanie pamięci, itp.

Zaproponuję ci JENSOR, program Java o otwartym kodzie źródłowym, ze względu na łatwość użytkowania i niskie koszty ogólne procesora.Możesz go pobrać, zaprogramować kod i uzyskać wszystkie potrzebne informacje o kodzie.

Można go pobrać z: http://jensor.sourceforge.net/

+2

Niemożliwe jest, aby profiler miał narzut * no * cpu. Chociaż ten jeden może mieć kilka szczególnych kosztów, nie znam tego. – jmg

5

Z ThreadMXBean można uzyskać użycie procesora poszczególnych wątków i czasu procesora spożywanych zamiast upłynąć czasu, które mogą być użyteczne.

Jednak jego często prostsze użycie profilera, ponieważ ten proces często generuje wiele danych i potrzebujesz dobrego narzędzia do wizualizacji, aby zobaczyć, co się dzieje.

Używam Yourkita, ponieważ łatwiej jest rozwiązywać problemy, które stosowałem w innych profilerach. Używam również wbudowanego hprofu, ponieważ może to dać ci inny widok na profilu twojej aplikacji (ale nie jest tak przydatny).

+1

Zobacz także ten samouczek dotyczący ThreadMXBean: http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking – utapyngo

Powiązane problemy