以纳秒为单位查找每个 Fibonacci(n) 的时钟时间

Find the clock time for each Fibonacci(n) in nanoseconds

我试图找出每个 Fibonacci(n) 需要多长时间(以纳秒为单位)。我的代码中的时钟时间对于所有 n 总是相同的。我想我犯了一个错误。我该如何解决?

这是我的一些输出:

0 used 3792 ns
1 used 3792 ns
1 used 3792 ns
2 used 3792 ns

...............

0 used 2455 ns
1 used 2455 ns
1 used 2455 ns
2 used 2455 ns

...............

0 used 2675 ns
1 used 2675 ns
1 used 2675 ns
2 used 2675 ns

class Fibonacci {
    private static long startTime = System.nanoTime();
    public static int fib(int n)
    {
        if (n <= 1)
            return n;
        return fib(n-1) + fib(n-2);
    }
    private static long endTime = System.nanoTime();

    public static void main (String args[])
    {
        long time = (endTime - startTime);
            for(int n = 0;n < 25; n++) {
                System.out.println(fib(n) + " used " + time + " ns");
        }
    }
} 

在每次迭代中获取调用方法之前的开始时间和之后的结束时间。请注意,这些性能测量并不是最准确的。

for(int n = 0;n < 25; n++) {
    long start = System.nanoTime();
    System.out.println(fib(n) + " used " + (System.nanoTime() - start) + " ns");
}

为了与 hev1 的回答保持一致,请注意我是如何重新排列您的代码的。请注意现在如何同时声明 startTime 和 endTime。我想你认为通过将它放在你的方法下面,它会在方法之后执行。

没有。它不是那样工作的。执行前后,在下面的 for 循环中进行...不是 因为您在 class 中声明它们的顺序 作为字段。

看看这个:与 hev1 的类似修复

class Fibonacci  {
    private static long startTime;
    private static long endTime;

    public static int fib(int n)
    {
        if (n <= 1)
            return n;
        return fib(n-1) + fib(n-2);
    }

    public static void main (String args[])
    {
        for(int n = 0;n < 25; n++) {
            startTime = System.nanoTime();
            int result = Fibonacci.fib(n);
            endTime = System.nanoTime();
            //System.out.println(result + " used " + (endTime - startTime) + " ns");
            System.out.format("%d\t\tused\t%d\tns\n", result, (endTime - startTime));
        }
    }
} 

输出:

0        used   5100     ns
1        used   1100     ns
1        used   800      ns
2        used   900      ns
3        used   1300     ns
5        used   1800     ns
8        used   3200     ns
13       used   5400     ns
21       used   9300     ns
34       used   81800    ns
55       used   24700    ns
89       used   3700     ns
144      used   4000     ns
233      used   5900     ns
377      used   10100    ns
610      used   19500    ns
987      used   1281600  ns
1597     used   37900    ns
2584     used   30900    ns
4181     used   46100    ns
6765     used   72900    ns
10946    used   117300   ns
17711    used   189500   ns
28657    used   275400   ns
46368    used   492200   ns