Java 找到每个斐波那契(n)的时钟时间,单位为纳秒

Java 找到每个斐波那契(n)的时钟时间,单位为纳秒,java,for-loop,recursion,time,clock,Java,For Loop,Recursion,Time,Clock,我试图找出每一个斐波那契(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 use

我试图找出每一个斐波那契(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

类斐波那契{
private static long startTime=System.nanoTime();
公共静态整数fib(整数n)
{

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

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

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

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

根据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));
        }
    }
} 

与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));
        }
    }
} 

让“System.out.println”不计时不是更好吗?打印比数值计算花费更多的时间。保存fib(n)然后再打印出来。我想这是解决了一个不同于问题的问题。问题是为什么代码没有按预期的方式工作。我试着教他们一些我认为他们对语言基础的理解不稳定的地方。这是一种以准确的方式衡量这一点的合理方法吗?我不知道“我想我们还没到那一步,我们甚至还在学习这门语言是如何工作的。我试图解决我认为是他们的问题。@Daniel Widdis……但既然我同意你的意见,我就修改了你的建议。”为什么987要花这么长的时间来计算?或者是我移动鼠标的时候花了这么长的时间?很多关于随机更长时间的解释。0的长度比热身时的长度要长,没有理由0和1会有任何不同。34和55也异常长。可能是编译器优化、分支预测、垃圾收集,这三者的混合。为了获得更好的结果,你应该随机化顺序,重复每一次计算数千次,然后平均计算结果。让“System.out.println”不计时不是更好吗?打印比数值计算花费更多的时间。保存fib(n)然后再打印出来。我想这是解决了一个不同于问题的问题。问题是为什么代码没有按预期的方式工作。我试着教他们一些我认为他们对语言基础的理解不稳定的地方。这是一种以准确的方式衡量这一点的合理方法吗?我不知道“我想我们还没到那一步,我们仍在学习这种语言是如何工作的。我试图解决我认为是他们的问题。@Daniel Widdis…但既然我同意你的意见,我就编辑了你的建议。;)为什么987花了这么长时间计算?还是我移动鼠标时花了这么长时间?对随机更长的时间有很多解释。0比它应该的时间长。”ld只是为了热身,没有理由0和1会有任何不同。34和55也异常长。可能是编译器优化、分支预测、垃圾收集,三者的混合。为了获得更好的结果,你应该随机化顺序,重复每个计算数千次,并平均结果。可能相关:Probably相关: