2013-01-24 47 views
9

w Java/Groovy aplikacja używam org.slf4j.Logger Lubię zalogować metodę czas wykonania i proponuje użyć poniższy kodRejestrowanie metoda czasie wykonywania

def startTime 
LOGGER.isDebugEnabled() { 
    startTime = System.currentTimeMillis() 
} 

doSomething() 

LOGGER.debug("Execution took {}ms", (System.currentTimeMillis() - startTime)) 

myślę, że ten kod jest „brzydka”. Czy ktoś może zaproponować coś bardziej eleganckiego?

Odpowiedz

5

Jeśli chcesz, aby kod wyglądać mniej brzydki:

Zmień

def startTime 
LOGGER.isDebugEnabled() { 
    startTime = System.currentTimeMillis() 
} 

do

def startTime = System.currentTimeMillis() 

Nie jestem fanem isDebugEnabled dla tych jednej wkładki. Nie zobaczysz żadnej różnicy wydajności bez tego.

+0

zgadzam się, jeśli gdziekolwiek powinno być w miejscu, gdzie występuje rzeczywista rejestrowanie zamiast na prosty wysiąść czas systemowy. Ale ten dziennik jest tylko prostym łańcuchem, więc nie jest to również konieczne. –

6

Prawdopodobnie możesz użyć tej klasy do obliczenia upływu czasu.

public class StopWatch { 

    /* Private Instance Variables */ 
    /** Stores the start time when an object of the StopWatch class is initialized. */ 
    private long startTime; 

    /** 
    * Custom constructor which initializes the {@link #startTime} parameter. 
    */ 
    public StopWatch() { 
     startTime = System.currentTimeMillis(); 
    } 

    /** 
    * Gets the elapsed time (in seconds) since the time the object of StopWatch was initialized. 
    * 
    * @return Elapsed time in seconds. 
    */ 
    public double getElapsedTime() { 
     long endTime = System.currentTimeMillis(); 
     return (double) (endTime - startTime)/(1000); 
    } 
} 

i używać go tak:

public class SWTest { 

    public static void main(String[] args) { 
     StopWatch stopWatch = new StopWatch(); 

     doSomething(); 

     LOGGER.debug("Execution took in seconds: ", (stopWatch.getElapsedTime()); 
    } 
} 
+0

+1 - To jest miłe, nadal możesz usunąć 'LOGGER.isDebugEnabled() {' :) – cowls

+0

@ cowls Thanks.Zrobione :) – aa8y

+0

@ aa8y - Czy to absolutnie konieczne, aby obliczyć upływ czasu? A co, jeśli użyjemy 'stopwatch.toString()' do zalogowania upływu czasu? – Divs

2

Można również użyć AOP i adnotacje Java, aby dokonać czyszczenia kodu. Polecam używać @Loggable adnotacji i aspekt AspectJ z jcabi-aspects (jestem programistą):

@Loggable(Loggable.DEBUG) 
public String load(URL url) { 
    // do something 
} 

Wszystkie wywołania tej metody będą rejestrowane, ze wszystkimi parametrami i czasu realizacji, poprzez slf4j.

+0

Witam, próbuję użyć aspektów jcabi, jak zaznaczono w Twojej odpowiedzi, tylko używam go na całej klasie (więc klasa jest opisana, nie każda metoda w nim), ale nie dostaję nic w dzienniku. Czy powinna istnieć jakakolwiek konfiguracja? – Dragos

+0

Tak, powinieneś utkać swoje klasy, jak wyjaśniono w http://aspects.jcabi.com/index.html (wyślij wiadomość do [jcabi grupa Google] (https://groups.google.com/forum/#! forum/jcabi), omówimy szczegółowo). – yegor256

+0

Zobacz także http://aspects.jcabi.com/example-weaving.html – yegor256

3

Mierząc różnicę między 2 punktami w czasie, powinieneś użyć System.nanoTime(), wariant millis powinien być użyty, gdy jesteś faktycznie zainteresowany mierzeniem czasu (od wartości epoki), ale nie wtedy, gdy chcesz mierzyć różnicę w czasie tak dokładnie, jak to możliwe.

zobaczyć również http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#nanoTime()

Zwraca bieżącą wartość wysokiej rozdzielczości źródła czasu pracującym Java Virtual Machine, w nanosekund.

0

Jeśli użyto wiosna:

StopWatch watch = new StopWatch(); 
    watch.start(); 
    for(int i=0; i < 1000000; i++){ 
     Object obj = new Object(); 
    }  
    watch.stop(); 

    System.out.println("Total execution time to create 1000K objects in Java using StopWatch in millis: "    + watch.getTotalTimeMillis()); 
2

Obecne propozycje wydają się nie być korzystając z faktu, że PO jest za pomocą Groovy.

Oto moje zdanie na jej temat: przykład

class CodeTimer { 

    /** 
    * Time how long it takes to run a piece of code 
    * 
    * @param closure code to execute and time 
    * @return time elapsed in nano seconds 
    */ 
    static final long time(closure) { 
     long startTime = System.nanoTime() 

     closure() 

     return System.nanoTime() - startTime 
    } 
} 

Zastosowanie:

def duration = CodeTimer.time({ 
    sql.executeUpdate(QUERY) 
}) 

log.debug("Execution took ${duration}ns") 
Powiązane problemy