5

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

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 位的。

4

5 回答 5

4

因为你的程序并不是机器上唯一运行的东西。操作系统本身、所有其他应用程序等……它们也占用 CPU 时间——而且并不总是完全相同。

于 2013-05-27T17:16:59.467 回答
2

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

于 2013-05-27T17:23:13.920 回答
1

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

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

于 2013-05-27T17:21:32.393 回答
0

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

即使时代不同,我也看不到太多变化。

于 2013-05-27T17:18:42.077 回答
0

可靠地分析 Java 程序绝非易事。除了您的机器上的其他进程在执行它们的工作引起的变化之外,已经在其他答案中指出,如果虚拟机具有即时编译器,您还会由于垃圾收集和虚拟机的有趣效果而获得不确定性。

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

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

于 2013-05-27T20:12:11.477 回答