- Jak uzyskać czas wykonania metody?
- Czy istnieje
Timer
klasa użyteczności dla takich rzeczy, jak czas, ile czasu zajmuje zadanie itp.?
Większość wyszukiwań w Google zwraca wyniki dla liczników, które planują wątki i zadania, czego nie chcę.
java
timing
execution-time
Ogre Psalm 33
źródło
źródło
Instant
klasy: stackoverflow.com/a/30975902/1216775Odpowiedzi:
Zawsze jest staromodny sposób:
źródło
Idę z prostą odpowiedzią. Pracuje dla mnie.
Działa całkiem dobrze. Rozdzielczość jest oczywiście tylko z dokładnością do milisekundy, można to zrobić lepiej za pomocą System.nanoTime (). Istnieją pewne ograniczenia obu (wycinki harmonogramu systemu operacyjnego itp.), Ale działa to całkiem dobrze.
Średnia z kilku przebiegów (im więcej, tym lepiej), a otrzymasz porządny pomysł.
źródło
nanoTime
gwarantuje, że będzie co najmniej tak samo stanowczy jakcurrentTimeMillis
. docs.oracle.com/javase/7/docs/api/java/lang/…currentTimeMillis
jest to, że jest to rzeczywisty znacznik czasu i może być również używany do rejestrowania czasów rozpoczęcia / zakończenia, podczas gdynanoTime
„może być używany tylko do pomiaru upływającego czasu i nie jest związany z żadnym innym pojęciem czasu systemowego lub zegara ściennego . ”Dawajcie ludzie! Nikt nie wspominał o sposobie Guawy (co jest prawdopodobnie niesamowite):
Zaletą jest to, że Stopwatch.toString () wykonuje dobrą robotę, wybierając jednostki czasu do pomiaru. To znaczy, jeśli wartość jest mała, wyniesie 38 ns, jeśli jest długa, pokaże 5m 3s
Jeszcze ładniej:
Uwaga: Google Guava wymaga Java 1.6+
źródło
start()
wielokrotnego dzwonienia z rzędu (tak samo dlastop()
).Używając Instant i Duration z nowego API Java 8,
wyjścia,
źródło
Duration.between(start, end).getSeconds()
.Duration
ma również metody konwersji na inne jednostki czasu, np.toMillis()
które konwertują na milisekundy.Zebraliśmy wszystkie możliwe sposoby razem w jednym miejscu.
Data
System. currentTimeMillis ()
Format czytelny dla człowieka
Guava: Google Stopwatch JAR «Celem Stopwatch jest pomiar upływającego czasu w nanosekundach.
Apache Commons Lang JAR « StopWatch zapewnia wygodny interfejs API do pomiaru czasu.
JODA- CZAS
Interfejs API daty i czasu Java z Java 8 «Obiekt Duration reprezentuje okres między dwoma obiektami Instant .
Spring Framework zapewniaklasę narzędzia StopWatch do pomiaru upływu czasu w Javie.
Wynik:
źródło
Użyj profilera (JProfiler, Netbeans Profiler, Visual VM, Eclipse Profiler itp.). Otrzymasz najdokładniejsze wyniki i jest najmniej ingerujący. Korzystają z wbudowanego mechanizmu JVM do profilowania, który może również dostarczyć dodatkowych informacji, takich jak ślady stosu, ścieżki wykonania i, w razie potrzeby, bardziej wyczerpujące wyniki.
Podczas korzystania z w pełni zintegrowanego profilera profilowanie metody jest banalnie proste. Kliknij prawym przyciskiem myszy, Profiler -> Dodaj do metod rootowania. Następnie uruchom profiler tak samo, jak robiłeś test lub debugger.
źródło
Prawdopodobnie nie chciałem tego powiedzieć, ale jest to dobre wykorzystanie AOP. Uderz przechwytywacz proxy wokół swojej metody i dokonaj pomiaru czasu.
Co, dlaczego i jak AOP jest raczej poza zakresem tej odpowiedzi, niestety, ale tak właśnie to zrobiłbym.
Edycja: Oto link do Spring AOP, aby zacząć, jeśli chcesz. Jest to najbardziej dostępna implementacja AOP, którą Iive spotkało w Javie.
Ponadto, biorąc pod uwagę bardzo proste sugestie wszystkich innych, powinienem dodać, że AOP jest na wypadek, gdy nie chcesz, aby inwazja kodu miała czas. Ale w wielu przypadkach takie proste i łatwe podejście jest w porządku.
źródło
System.currentTimeMillis();
NIE JEST dobrym podejściem do pomiaru wydajności twoich algorytmów. Mierzy całkowity czas spędzany przez użytkownika podczas oglądania ekranu komputera. Obejmuje to również czas zużywany przez wszystko inne uruchomione na komputerze w tle. Może to mieć ogromną różnicę, jeśli na stacji roboczej działa wiele programów.Prawidłowe podejście polega na użyciu
java.lang.management
pakietu.Ze strony http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking :
getCpuTime()
metoda daje sumę tych:źródło
W Javie 8 możesz zrobić coś takiego za pomocą każdej normalnej metody :
z TimeIt lubi:
Dzięki tej metodzie możesz łatwo dokonywać pomiaru czasu w dowolnym miejscu kodu, nie przerywając go. W tym prostym przykładzie po prostu wydrukowałem czas. Możesz dodać Switch for TimeIt, np. Aby wydrukować czas tylko w trybie debugowania lub coś takiego.
Jeśli pracujesz z funkcją , możesz zrobić coś takiego:
źródło
Możemy również użyć klasy wspólnych apache StopWatch do pomiaru czasu.
Przykładowy kod
źródło
Mały zwrot akcji, jeśli nie używasz narzędzi i chcesz mierzyć czas metodami o niskim czasie wykonania: wykonaj go wiele razy, za każdym razem podwajając liczbę wykonań aż do sekundy lub mniej więcej. Tak więc czas wywołania System.nanoTime i tak dalej, ani dokładność System.nanoTime nie wpływa znacząco na wynik.
Oczywiście mają zastosowanie zastrzeżenia dotyczące korzystania z zegara ściennego: wpływy kompilacji JIT, wiele wątków / procesów itp. Dlatego najpierw musisz wykonać tę metodę wiele razy, aby kompilator JIT działał, a następnie powtórz ten test wiele razy i weź najkrótszy czas wykonania.
źródło
W tym celu używamy adnotacji AspectJ i Java. Jeśli potrzebujemy znać czas wykonania metody, po prostu ją opatrzymy adnotacją. Bardziej zaawansowana wersja może korzystać z własnego poziomu dziennika, który można włączać i wyłączać w czasie wykonywania.
źródło
JEP 230: pakiet Microbenchmark
Do Twojej wiadomości, JEP 230: Microbenchmark Suite to projekt OpenJDK , który:
Ta funkcja pojawiła się w Javie 12 .
Uprząż Microbenchmark Java (JMH)
W przypadku wcześniejszych wersji Java zapoznaj się z projektem Java Microbenchmark Harness (JMH) , na którym oparty jest JEP 230.
źródło
Naprawdę dobry kod.
http://www.rgagnon.com/javadetails/java-0585.html
źródło
long millis = TimeUnit.MILLISECONDS.toMillis(duration) - TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration)); if (days == 0) { res = String.format("%02d:%02d:%02d.%02d", hours, minutes, seconds, millis); } else { res = String.format("%dd%02d:%02d:%02d.%02d", days, hours, minutes, seconds, millis); }
Możesz użyć Perf4j . Bardzo fajne narzędzie. Użycie jest proste
Więcej informacji można znaleźć w Przewodniku dla programistówEdycja: Projekt wydaje się martwy
źródło
źródło
Zasadniczo robię różne warianty tego, ale biorąc pod uwagę, jak działa kompilacja hotspotów, jeśli chcesz uzyskać dokładne wyniki, musisz wyrzucić kilka pierwszych pomiarów i upewnić się, że używasz tej metody w rzeczywistej aplikacji (czytaj specyficznej dla aplikacji).
Jeśli JIT zdecyduje się go skompilować, twoje liczby będą się znacznie różnić. więc po prostu bądź świadomy
źródło
Używając AOP / AspectJ i
@Loggable
adnotacji z aspektów jcabi , możesz to zrobić łatwo i kompaktowo:Każde wywołanie tej metody będzie wysyłane do funkcji rejestrowania SLF4J z
DEBUG
poziomem rejestrowania. I każdy komunikat dziennika będzie zawierał czas wykonania.źródło
Spring udostępnia klasę narzędziową org.springframework.util.StopWatch , zgodnie z JavaDoc:
Stosowanie:
Wynik:
Z aspektami:
źródło
Napisałem metodę drukowania czasu wykonania metody w bardzo czytelnej formie. Na przykład, aby obliczyć silnię 1 milion, zajmuje to około 9 minut. Czas wykonania zostanie wydrukowany jako:
Kod jest tutaj:
źródło
Można to zrobić na kilka sposobów. Zwykle wracam do korzystania z czegoś takiego:
lub to samo z System.nanoTime ();
Wydaje się, że istnieje coś więcej po stronie testów porównawczych: http://jetm.void.fm/ Nigdy tego nie próbowałem.
źródło
Możesz użyć biblioteki Metrics, która zawiera różne przyrządy pomiarowe. Dodaj zależność:
I skonfiguruj go dla swojego środowiska.
Metody można opatrywać adnotacjami @Timed :
lub fragment kodu zawinięty w Timer :
Zagregowane dane można wyeksportować do konsoli, JMX, CSV lub innych.
@Timed
przykładowy wynik pomiaru:źródło
Jeśli chcesz czas naścienny
źródło
Jak powiedział „skaffman”, użyj AOP LUB możesz użyć tkania kodu bajtowego w czasie wykonywania, tak jak narzędzia do pokrywania metod testów jednostkowych używają do przezroczystego dodawania informacji o czasie do wywoływanych metod.
Możesz spojrzeć na kod używany przez narzędzia narzędzi open source, takie jak Emma ( http://downloads.sourceforge.net/emma/emma-2.0.5312-src.zip?modtime=1118607545&big_mirror=0 ). Drugim narzędziem pokrycia OpenSource jest http://prdownloads.sourceforge.net/cobertura/cobertura-1.9-src.zip?download .
Jeśli w końcu uda ci się zrobić to, co zaplanowałeś, proszę. udostępnij go społeczności tutaj ze swoim zadaniem / słoikami na mrówki.
źródło
źródło
Zmodyfikowałem kod z poprawnej odpowiedzi, aby uzyskać wynik w kilka sekund:
źródło
Możesz użyć klasy stopera z wiosennego projektu rdzenia:
Kod:
Dokumentacja dla stopera: Prosty stoper, pozwalający na określenie czasu szeregu zadań, odsłaniający całkowity czas działania i czas wykonywania każdego nazwanego zadania. Ukrywa użycie System.currentTimeMillis (), poprawiając czytelność kodu aplikacji i zmniejszając prawdopodobieństwo błędów obliczeniowych. Zauważ, że ten obiekt nie został zaprojektowany jako bezpieczny dla wątków i nie używa synchronizacji. Ta klasa jest zwykle używana do sprawdzania wydajności podczas weryfikacji koncepcji i rozwoju, a nie jako część aplikacji produkcyjnych.
źródło
Możesz spróbować w ten sposób, jeśli chcesz znać czas.
źródło
Ok, to jest prosta klasa, której można użyć do prostego pomiaru czasu twoich funkcji. Poniżej znajduje się przykład.
Przykład zastosowania:
Próbka wyjścia konsoli:
źródło
W Javie 8 wprowadzono nową klasę o nazwie
Instant
. Zgodnie z dokumentem:Może to być użyte jako:
Drukuje
PT7.001S
.źródło