10

いくつかのメソッドの実行時間を測定しようとしています。同じコードを何度も複製するのではなく、メソッドを作成することを考えていました。

これが私のコードです:

private void MeasureExecutionTime(Method m)
{
    startTime = System.nanoTime();
    try
    {
        m();
    }
    finally
    {
        endTime = System.nanoTime();
    }
    elapsedTime = endTime - startTime;
    System.out.println("This takes " + elapsedTime + " ns.");
}

を持っているとします。 の実行時間を測定するためmyMethod()にどのように使用できますか?MeasureExecutionTime()myMethod

4

6 に答える 6

9

メソッドは Java のファースト クラス オブジェクトではないため、パラメーターとして渡すことはできません。Runnableインターフェイスなどを拡張する厄介なクラスでメソッド呼び出しをラップすることができます。

private void MeasureExecutionTime(Runnable r) {
    r.run();
}

...


MeasureExecutionTime(new Runnable() { public void run() { m(); } });
于 2011-05-19T15:30:12.970 に答える
7

これを行う最も簡単な方法は、インターフェイスを渡すことです。だから何か

public interface CommonFuncs {

   public void execute();
   ... more functions

}

次に、 CommonFuncs を引数として取るメソッドを持つことができます。これらのメソッドの実装は、メソッドを呼び出すことができますexecute

于 2011-05-19T15:28:24.620 に答える
2

私は@hvgotcodesに同意しますが、はい、可能ですが、のように呼び出すのではなく、 invokem()を使用します(つまり、おそらく別の引数または2つを渡す必要があります...)。

于 2011-05-19T15:31:03.513 に答える
2

あなたは正しいパスにいます。メソッドオブジェクト、メソッドを実行するターゲットオブジェクト、およびそれが取る引数を渡し、それをtry catchに呼び出す必要があります。

private void MeasureExecutionTime(Method m, Object target, Object args) 
                            throws IllegalArgumentException, 
                                   IllegalAccessException, 
                                   InvocationTargetException
{
    long startTime = System.nanoTime();
    long endTime;
    try
    {
        m.invoke(target, args);
    }
    finally
    {
        endTime = System.nanoTime();
    }
    long elapsedTime = endTime - startTime;
    System.out.println("This takes " + elapsedTime + " ns.");
}
于 2011-05-19T15:31:59.953 に答える
1

基本的に次のようなオブジェクト呼び出し Counter があります。

private long count;
private long errors;
private long duration;
private long errorDuration;

何かを返すメソッドと無効な他のメソッドをタイミングするための2つの「時間」メソッドがあります。

public <T> T time(ReturningRunnable<T> runnable) {
    long start = currentTimeMillis();
    T result = null;
    try {
        result = runnable.run();
    } catch (Throwable ex) {
        errorDuration += currentTimeMillis() - start;
        errors++;
        throw runtime(ex);
    }
    duration += currentTimeMillis() - start;
    count++;
    return result;
}

public void time(Runnable runnable) {
    time(new RunnableRunner(runnable));
}

私は実行時例外として例外を再スローすることにしました (私はチェック例外のファンではないため) が、カスタム MyRunnable インターフェイスで例外をスローし、それらをキャッチして再スローすることもできます。上記の使用法は次のとおりです。

counter.time(new Runnable() {
    @Override
    public void run() {
        // Do something
    });

または、戻り値の場合は次のようになります。

return counter.time(new ReturningRunnable<Integer>() {
    @Override
    public Integer run() {
        return 1; // You get the idea
    });

カウンター オブジェクトを JMX 経由で公開し、必要な場所に挿入できるため、これが気に入っています。リフレクションで要求したことを実行できますが、それは面倒だと思います(IMHO)。

于 2011-05-19T15:34:53.713 に答える
1

あなたは次のようにすることができます:

private void MeasureExecutionTime(Method m)
{

    startTime = System.nanoTime();
    try
    {
        m.invoke(classObj, args);
    }
    finally
    {
        int endTime = System.nanoTime();
    }
    elapsedTime = endTime - startTime;
    System.out.println("This takes " + elapsedTime + " ns.");
}
于 2011-05-19T15:36:12.000 に答える