Найдите время на часах для каждого числа Фибоначчи (n) в наносекундах - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь найти, сколько времени занимает каждая Фибоначчи (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");
        }
    }
} 

Ответы [ 2 ]

1 голос
/ 09 июля 2020

В соответствии с ответом hev1 обратите внимание, как я изменил ваш код. Обратите внимание, как теперь оба startTime и endTime объявлены вместе. Думаю, вы думали, что, разместив это под своим методом, он будет выполняться после метода.

Нет. Так не работает. Выполнение «до» и «после» выполняется ниже в for l oop ... не из-за порядка, в котором вы объявили их в классе как поля.

Посмотрите на это: с аналогичным исправлением для 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
1 голос
/ 09 июля 2020

Получить время начала перед вызовом метода и время окончания после каждой итерации. Обратите внимание, что эти измерения производительности не самые точные.

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