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

2 つの時点の差を測定する場合は、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 に答える