Javaで参照によって別のメソッドの時間を計るメソッドを作成することは可能ですか?
私は次のようなことを考えています:
int timeMethod(method myMethod) {
long start = time
run myMethod
long end = time
return end-start
}
メソッド呼び出しを でラップし、の実行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(...);
}
});
AOP (aspectJ 実装) は、再発明しようとしているものです。例を説明する簡単な Google リンクを次に示します。
最初に使用System.currentTimeMillis();
し、メソッドの最後にそれを使用して、前述のように2つを差し引くことができます。
public void timeExtensiveMethod() {
long start = System.currentTimeMillis();
//do stuff
long end = System.currentTimeMillis();
System.out.println("Time taken: " + (end - start));
}
上記のすべての変数が必要なわけではないことに注意してください。それらは思考プロセスを示すためのものです。
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
はい、可能ですが、そのような「ばかげた」プロファイラーではなく、実際のプロファイラーを使用する必要があると思います。
メソッドを呼び出したり、経過時間を測定したりするには、リフレクションを使用する必要があります。System.currentTimeMillis()
System.nanoTime()
long measureMethodExecutionTime(Method method, Object object, Object[] args) {
long startTime = System.currentTimeMillis();
method.invoke(object, args);
return System.currentTimeMillis() - startTime;
}
いいえ、Javaではメソッドをパラメーターとして渡すことはできません