记录方法执行时间

时间:2013-01-24 13:07:50

标签: java logging groovy

在java / groovy应用程序中我正在使用org.slf4j.Logger 我喜欢记录方法执行时间并建议使用以下代码

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

doSomething()

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

我认为这段代码很“难看”。 谁能提出更优雅的建议?

6 个答案:

答案 0 :(得分:7)

您可以使用此类计算已用时间。

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);
    }
}

并像这样使用它:

public class SWTest {

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

        doSomething();

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

答案 1 :(得分:5)

如果你想让代码看起来不那么难看:

更改

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

def startTime = System.currentTimeMillis()

我不是isDebugEnabled这些单线的粉丝。没有它,你不会看到任何性能差异。

答案 2 :(得分:3)

您还可以使用AOP和Java注释,使您的代码更清晰。我建议使用@Loggable注释和jcabi-aspects中的AspectJ方面(我是开发人员):

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

将通过SLF4J记录对此方法的所有调用以及所有参数和执行时间。

答案 3 :(得分:3)

当测量2个时间点之间的差异时,您应该使用System.nanoTime(),当您实际感兴趣测量时间(来自纪元值)时,应使用millis变体,而不是当您想要测量时时间的差异尽可能精确。

另见http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#nanoTime()

  

返回正在运行的Java虚拟机的当前值   高分辨率时间源,以纳秒为单位。

答案 4 :(得分:3)

目前的建议似乎并没有利用OP正在使用Groovy这一事实。

这是我的看法:

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
    }
}

用法示例:

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

log.debug("Execution took ${duration}ns")

答案 5 :(得分:0)

如果你使用了春天:

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());