2012-10-28 11 views
10

Chcę przetestować czas pracy określonego bloku kodu w następujący sposób:W języku java, jak szybko szybko dodawać adnotacje do kilku linii kodu?

start = System.currentTimeMillis(); 
{ 
    ... 
    this.dosomething(); 
} 
end = System.currentTimeMillis(); 
System.out.println(end - start); 

kiedy optymalizacji blok kodu, jaki mogę opisywać te kody, które obliczają czas szybko jak poniżej?

//start = System.currentTimeMillis(); 
{ 
    ... 
    this.dosomething(); 
} 
//end = System.currentTimeMillis(); 
//System.out.println(end - start); 
+0

Coś podobnego do [tej odpowiedzi] (http://stackoverflow.com/a/4836219/477878)? –

+0

Brak odpowiedzi na twoje pytanie, ale ** proszę ** nie używaj 'System.currentTimeMillis()' do celów analizy porównawczej, zamiast tego użyj 'System.nanoTime()'. I proszę przeczytać odpowiedzi na to pytanie: [Jak napisać poprawny mikro-benchmark w Javie?] (Http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro- benchmark-in-java) –

Odpowiedz

1

Jeśli chcesz tylko coś prostego, zawsze można mieć debug (logiczna) zmienną, która jest prawdziwa, gdy chcesz informacje debugowania mają być wydrukowane, na przykład:

if (debug) start = System.currentTimeMillis(); 
{ 
    ... 
    this.dosomething(); 
} 
if (debug) { 
    end = System.currentTimeMillis(); 
    System.out.println(end - start); 
} 

Kiedy jestem robiąc to, często ustawiam debug używając argumentów linii poleceń, więc nie trzeba zmieniać kodu, aby przełączać tryb debugowania.

EDYCJA: Jeśli chcesz powtórzyć tę strukturę w innym miejscu w programie, zdecydowanie skorzystam z AOP, jak wspomniano w innych odpowiedziach.

+0

+1 dla mnie, ponieważ jest to proste rozwiązanie. – DaveFar

-1

Nie bardzo nie rozumiem twojego znaczenia. jeśli chcesz tylko skomentować kod, skrótem jest ctrl +/in eclipse. A jeśli spróbujesz wpisać ten kod w swój projekt, możesz użyć log4j do zrobienia tego rodzaju rzeczy.

+2

Oryginalny plakat nie wskazał, którego IDE używa (Eclipse to tylko jedna z wielu możliwości). Ponadto będziesz musiał poszerzyć swoją odpowiedź, aby wyjaśnić, dlaczego log4j może pomóc, ponieważ nie widzę sposobu. –

+0

Właśnie dołączyłem do tego wspaniałego miejsca, więc nie wiem, co to jest reguła i cieszę się, że mogę podzielić się moim pomysłem. Ale jeśli nie jest to dozwolone, to jest mi przykro z tego powodu. – OQJF

+0

StackOverflow nie istniałby bez ludzi dzielących się pomysłami - to w porządku. Ale rozwija się również na wzajemnej ocenie i konstruktywnej krytyce. Nie każda udzielona odpowiedź będzie prawidłowa i ważne jest, aby nie być zranionym, gdy inni kwestionują twoją odpowiedź. Nie wszystkie komentarze są poprawne, tak przy okazji :-) –

2

Można użyć annotation processing, aby utworzyć compile timeannotations i na tej podstawie wygenerować kod źródłowy. W tej wersji omówiono generowanie kodu za pomocą adnotacji. Można zdefiniować adnotacje niestandardowe, takie jak @Start, @End, @Calculate i używać ich jak poniżej. Jeśli nie wygenerujesz kodu źródłowego, zostaną one usunięte.

@Start 
{ 
     ... 
     this.dosomething(); 
} 
@End 
@Caclulate 

Uwaga: Nie można zmodyfikować kodu, który ma zostać skontrolowany, dlatego należy utworzyć podklasę.

1

Oddzielając kod od pomiaru wydajności od głównego kodu od początku. Wykonaj jedną z następujących czynności:

  • jako chm052 opisany w jego anwswer, z pewnymi flagami i strzeżonymi poleceniami;
  • za pomocą struktury rejestrowania z tymi chronionymi poleceniami, np. SLF4J;
  • za pomocą (micro-)benchmarking tool, która pomaga w dobrych pomiarach czasu, statystykach i chronionych poleceniach (np. Za pośrednictwem AspectOrientedProgramming). Powinieneś zdecydowanie użyć takiego narzędzia, aby uzyskać sensowne pomiary (patrz np. https://stackoverflow.com/a/7120803/750378).
1

Podejście zaproponowane przez chm052 na pewno zadziała, ale spowoduje połączenie logiki czasu pomiaru z metodą biznesową, co nie jest pożądane. Po napisaniu całej metody wykonaj "dosomething()" - a przed i po nich chcesz zmierzyć czasy. Jutro będziesz chciał zalogować link oświadczenia "wprowadzając metody/pozostawiając metodę Zrób coś", za chwilę będziesz prawdopodobnie chciał sprawdzić uprawnienia, czy ten kod może być w ogóle uruchomiony.

Mam nadzieję, że masz mój punkt widzenia, a takie podejście jest dobre dla prostych projektów będzie zanieczyszczać kod z niepowiązanych obaw

Istnieje kilka technik.

  1. AOP, już to zasugerował Joachim Isaksson. AOP naprawdę świeci w tym obszarze. Utwórz poradę, w której będziesz korzystać z logiki zarządzania czasem i jesteś gotowa do pracy.

  2. Jeśli chcesz/trzeba trzymać do technologii OOP, proponuję stworzyć Proxy lub Decorator

Technicznie jest naprawdę blisko siebie, jej tylko, jak pamiętać o zamiarze twojego niepokoju.

Mam nadzieję, że to pomoże

4

Po prostu użyj profilera. Spowoduje to automatyczne zaprogramowanie kodu przy minimalnej powierzchni, wyświetlając różne statystyki i punkty aktywne. Sprawdź profiler built into JVisualVM, JProfiler lub YourKit.

Kiedy go nie potrzebujesz, nie płacisz za to nic.

+0

Jak "testować czas działania określonego bloku kodu" za pomocą profilera (jeśli blok kodu nie jest ani pojedynczą operacją, ani kompletną metodą)? – DaveFar

+0

@DaveBall: w rzeczy samej nie jest to możliwe. Sądzę, że najprostszym sposobem obejścia tego problemu byłoby po prostu wyodrębnienie metody (która często jest dobrym pomysłem) –