11

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

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

doSomething()

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

我认为这段代码“丑陋”。谁能建议一些更优雅的东西?

4

6 回答 6

9

您可能可以使用此类来计算经过的时间。

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());
    }
}
于 2013-01-24T13:11:05.507 回答
5

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

改变

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

def startTime = System.currentTimeMillis()

我不喜欢isDebugEnabled这些衬里。没有它,您将看不到任何性能差异。

于 2013-01-24T13:10:43.380 回答
4

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

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

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

于 2013-02-03T08:36:55.820 回答
4

当前的建议似乎没有利用 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")
于 2016-03-02T16:53:37.957 回答
3

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

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

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

于 2013-02-03T08:21:16.093 回答
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());
于 2016-02-22T10:03:28.947 回答