为什么Java中的时间不同

为什么Java中的时间不同,java,Java,我想知道为什么这段代码返回不同的时间: 我的产出是: Time1: 511 Time2: 228 for N: 100000000 Time1: 509 Time2: 229 for N: 100000001 Time1: 503 Time2: 229 for N: 100000002 我有: java version "1.6.0_24" OpenJDK Runtime Environment (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1)

我想知道为什么这段代码返回不同的时间:

我的产出是:

Time1: 511 Time2: 228 for N: 100000000
Time1: 509 Time2: 229 for N: 100000001
Time1: 503 Time2: 229 for N: 100000002
我有:

java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1)
OpenJDK Server VM (build 20.0-b12, mixed mode)
Intel® Pentium(R) CPU B960 @ 2.20GHz × 2 
Linux Ubuntu 12.04
我的代码如下所示:

public class test {

    public static void main(String[] arg)
    {
        for(long N=100000000;N<2000000000;++N){

            long time2 = System.currentTimeMillis();
            double d = 1.0; 
            double z = 1.0/3.0;
            for(long i = 0; i < N; i++)
            {
                d = d*z;
            }
            long result2 = System.currentTimeMillis() - time2;


            long time1 = System.currentTimeMillis();
            double x = 1.0;
            double f = 1.0/3.0;
            for(long i = 0; i < N; i++)
            {
                x = x*f;
            }
            long result1 = System.currentTimeMillis() - time1;



            System.out.println("Time1: " + result1 + " Time2: " + result2 + " bigger: " + (result1 > result2) + " for N: " + N);
        }

    }
}
公共类测试{
公共静态void main(字符串[]arg)
{
对于(长N=100000000;N结果2)+“对于N:”+N);
}
}
}

在Java中对代码进行基准测试很难

JVM在后台做很多事情:

  • 它动态优化代码
  • 在调用方法一定次数后编译方法(因此方法可能会突然变快,但编译会消耗资源,因此在一段时间内一切都可能变慢)
  • 如果认为合适,它可以将变量移出循环
  • 如果它看到它什么也不做,它甚至可以简单地删除一些代码(例如:您正在计算
    d
    ,但您没有对它做任何事情,那么为什么要计算它呢?JVM可以简单地删除这些代码;请阅读“转义分析”)
  • 还可能发生一些垃圾收集等情况
此外,您的操作系统可能会干扰JVM的执行等

因此,底线是:如果不深入研究JVM和操作系统的工作原理,就忘了做精确的基准测试。你不能期望得到有意义的结果


有关更多信息,请查看。它包含指向非常好的论文的链接。

您是否多次重复此代码?你的时间媒介是什么?时间可能因多种原因而不同:例如,您的进程和线程共享相同的CPU(1个或更多)和计算机的其他资源。您每次都会得到不同的值,而差异并不重要。

您的系统可用性不受Java控制。

如果您注意到,您的所有结果都在相同的范围内。这是您所能期望的最佳结果


如果JVM中还有其他一些事情在进行,例如垃圾收集,那么您的计时可能会有更多变化。

请记住:在现代操作系统上运行应用程序会产生副作用:其他应用程序也在那里运行。操作系统调度不同的应用程序,并在CPU上分配每个进程的时隙。每次执行应用程序时,它都会以不同的顺序与不同的其他进程一起执行。这会影响总的执行时间。

谢谢您的回复,但我只是为了好玩而测试它。因为这真的很奇怪。@Gelldur:我只是想告诉你,这种测量在JVM中没有意义,在我的机器上运行会给出与你看到的完全相反的结果:
Time1:179 Time2:456 biger:false表示N:10000004
,即,我一直都是
Time1
。是的,我运行了很多次,每次都是一样的+-10毫秒我知道,但当我在我的计算机上运行了很多次这个代码时,这并不重要,因为系统占用了0-2%的CPU。