1

Javaで参照によって別のメソッドの時間を計るメソッドを作成することは可能ですか?

私は次のようなことを考えています:

  int timeMethod(method myMethod) {
        long start = time
        run myMethod
        long end = time
        return end-start
     }
4

6 に答える 6

3

メソッド呼び出しを でラップし、の実行Runnableにかかる時間を次のように指定できます。Runnable

long timeMethod(Runnable myMethodRunner) {
    long start = System.nanoTime();
    myMethodRunner.run();
    return System.nanoTime() - start;
}

次に、次のようにメソッドの時間を計ります。

public void myMethod(...) {
    . . .
}

// later:

long timeInNanoSeconds = timeMethod(new Runnable() {
    public void run() {
        myMethod(...);
    }
});
于 2012-11-14T00:33:52.860 に答える
3

AOP (aspectJ 実装) は、再発明しようとしているものです例を説明する簡単な Google リンクを次に示します。

于 2012-11-14T00:18:18.313 に答える
1

最初に使用System.currentTimeMillis();し、メソッドの最後にそれを使用して、前述のように2つを差し引くことができます。

public void timeExtensiveMethod() {
    long start = System.currentTimeMillis();
    //do stuff 
    long end = System.currentTimeMillis();
    System.out.println("Time taken: " + (end - start));
}

上記のすべての変数が必要なわけではないことに注意してください。それらは思考プロセスを示すためのものです。

于 2012-11-14T00:18:07.407 に答える
1

Javaには関数ポインタのようなものはありません(少なくとも正確な関数ポインタではありません)。たとえば、次のようなコンポジションを試すことができます。

int timeMethod(MyClass object) {
        long start = System.currentTimeMillis();
        object.run();  //this class can implement a common interface and you program to interface not concrete implementation
        long duration = System.currentTimeMillis() - start;
        return duration;
     }

編集:AOPの+1

于 2012-11-14T00:20:06.950 に答える
1

はい、可能ですが、そのような「ばかげた」プロファイラーではなく、実際のプロファイラーを使用する必要があると思います。

メソッドを呼び出したり、経過時間を測定したりするには、リフレクションを使用する必要があります。System.currentTimeMillis()System.nanoTime()

long measureMethodExecutionTime(Method method, Object object, Object[] args) {
    long startTime = System.currentTimeMillis();

    method.invoke(object, args);

    return System.currentTimeMillis() - startTime;
}
于 2012-11-14T00:25:38.577 に答える
-1

いいえ、Javaではメソッドをパラメーターとして渡すことはできません

于 2012-11-14T00:19:19.853 に答える