1

是否可以在 Java 中通过引用创建一个方法来计时另一个方法?

我在想类似的东西:

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

6 回答 6

3

AOP(aspectJ 实现)是您要重新发明的,这里是描述示例的快速谷歌链接

于 2012-11-14T00:18:18.313 回答
3

您可以将方法调用包装在 aRunnable和 time 中运行需要多长时间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 回答
1

您可以使用System.currentTimeMillis();for start 并在方法结束时执行此操作,然后像您提到的那样减去两个。

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 回答