循环完成所花费的总时间对于每次执行总是不同的

时间:2013-05-27 17:15:53

标签: java

我有一个简单的下面的程序,它遍历一个数组

Integer [] intArray = new Integer[20000];
    int index=0;
    for(int i=10000; i>=0; i--){
        intArray[index]=i;
        index++;
    }

    long startTime = System.currentTimeMillis();
    for(Integer t : intArray){

        System.out.println(t);
    }
    long endTime = System.currentTimeMillis();
    long consumedTime = endTime-startTime;
    System.out.println("Consumed time "+ consumedTime);

我总是得到不同的消耗时间值,如743,790,738,825,678。

为什么for循环所花费的时间总是因执行而不同。

注意我在main方法中运行此代码。我的操作系统是Ubuntu,处理器是32位。

5 个答案:

答案 0 :(得分:4)

因为你的程序不是机器上唯一运行的程序。操作系统本身,所有其他应用程序等......它们也占用了CPU时间 - 并不总是完全相同的数量。

答案 1 :(得分:2)

没有具体的时间Java计划。这取决于机器上运行的是什么。此外,由于您使用的是Integer,因此需要更多时间。如果你只是原生的差异可能会更少。

答案 2 :(得分:1)

这是因为您的操作系统在运行Java程序时会切换任务并执行大量的同步操作。如果操作系统在运行时没有大量处理,程序可以很快,而且当操作系统繁忙时,它也可能很慢。

换句话说,每次程序运行时,操作系统都会执行一组不同的并发任务,执行时间也不同。

答案 3 :(得分:0)

因为Java对执行时间没有任何承诺。在现代操作系统中,有很多事情一下子发生。

即使时间不一样,我也没有看到太多变化。

答案 4 :(得分:0)

可靠地分析Java程序远非微不足道。除了你的机器上的其他进程所做的变化,已经在其他答案中指出,如果它具有即时编译器,你也会因垃圾收集和虚拟机的有趣效果而获得不确定性。< / p>

在您的示例中,垃圾收集实际上不是问题,但JIT编译可能会导致前几个循环迭代明显慢于接下来的几千个循环迭代。因此,将总时间除以迭代次数以获得每次迭代的平均时间的良好近似是错误的。

为了避免这种影响,在开始测量之前,你必须多次“锻炼”循环体。