为什么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在后台做很多事情:
- 它动态优化代码
- 在调用方法一定次数后编译方法(因此方法可能会突然变快,但编译会消耗资源,因此在一段时间内一切都可能变慢)
- 如果认为合适,它可以将变量移出循环
- 如果它看到它什么也不做,它甚至可以简单地删除一些代码(例如:您正在计算
,但您没有对它做任何事情,那么为什么要计算它呢?JVM可以简单地删除这些代码;请阅读“转义分析”)d
- 还可能发生一些垃圾收集等情况
有关更多信息,请查看。它包含指向非常好的论文的链接。您是否多次重复此代码?你的时间媒介是什么?时间可能因多种原因而不同:例如,您的进程和线程共享相同的CPU(1个或更多)和计算机的其他资源。您每次都会得到不同的值,而差异并不重要。您的系统可用性不受Java控制。 如果您注意到,您的所有结果都在相同的范围内。这是您所能期望的最佳结果
如果JVM中还有其他一些事情在进行,例如垃圾收集,那么您的计时可能会有更多变化。请记住:在现代操作系统上运行应用程序会产生副作用:其他应用程序也在那里运行。操作系统调度不同的应用程序,并在CPU上分配每个进程的时隙。每次执行应用程序时,它都会以不同的顺序与不同的其他进程一起执行。这会影响总的执行时间。谢谢您的回复,但我只是为了好玩而测试它。因为这真的很奇怪。@Gelldur:我只是想告诉你,这种测量在JVM中没有意义,在我的机器上运行会给出与你看到的完全相反的结果:
Time1:179 Time2:456 biger:false表示N:10000004
,即,我一直都是Time1
。是的,我运行了很多次,每次都是一样的+-10毫秒我知道,但当我在我的计算机上运行了很多次这个代码时,这并不重要,因为系统占用了0-2%的CPU。