【问题标题】:Find the clock time for each Fibonacci(n) in nanoseconds以纳秒为单位查找每个 Fibonacci(n) 的时钟时间
【发布时间】:2020-10-29 14:58:09
【问题描述】:

我试图找出每个 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");
        }
    }
} 

【问题讨论】:

标签: java for-loop recursion time clock


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    根据 hev1 的回答,请注意我是如何重新排列您的代码的。注意现在 startTime 和 endTime 是如何一起声明的。我认为您认为通过将其放在您的方法下方,它会在方法之后执行。

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

    看看这个:与 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
    

    【讨论】:

    • 让“System.out.println”不计时不是更好吗?打印比数字计算花费更多时间。保存 fib(n),稍后再打印出来。
    • 我认为,这与问题所要解决的问题不同。问题询问为什么代码没有按预期方式工作。我试图教他们一些我认为他们对语言基础知识的理解不稳定的地方。这是以任何准确的方式衡量这一点的合理方法吗?我认为我们还没有到达那里,我们仍在学习该语言的工作原理。我试图解决我认为是他们的问题。
    • @Daniel Widdis ...但既然我同意你的观点,我编辑了你的建议。 ;)
    • 为什么 987 需要这么长时间来计算?还是我移动鼠标的时候?
    • 对随机更长的时间有很多解释。 0 比单纯的热身时间要长,没有理由 0 和 1 应该有任何不同。 34 和 55 也异常长。可能是编译器优化、分支预测、垃圾收集,三者的混合。为了获得更好的结果,您应该随机排列顺序,重复每个计算数千次,然后平均结果。
    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2017-06-28
    相关资源
    最近更新 更多