我想知道为什么这段代码会返回不同的时间:
我的输出是:
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);
}
}
}
答案 0 :(得分:9)
Java 中的基准测试代码很难。
JVM在后台执行很多事情:
d
,但是你没有对它做任何事情,那么为什么要计算呢?允许JVM只需删除该代码;阅读“逃逸分析”)。此外,您的操作系统可能会干扰JVM的执行等。
所以,最重要的是:如果不仔细研究JVM和操作系统的工作原理,就不要忘记做精确的基准测试。你不能期望得到有意义的结果。
有关详情,请查看this question and answers。它包含非常好的论文的链接。
答案 1 :(得分:1)
您是否多次重复此代码?你得到的时间是多少?时间可能因多种原因而有所不同:例如,您的进程和线程共享相同的CPU(1个或更多)以及计算机的其他资源。每次都会得到不同的值,差异并不重要。
答案 2 :(得分:0)
您的系统可用性不受Java控制。
如果您注意到,您的所有结果都在相同的范围内。这是您所期望的最佳结果。
如果在JVM中还有其他一些事情发生,例如Garbage Collection
,您的时间可能会有所不同。
答案 3 :(得分:0)
请记住:在现代操作系统上运行应用程序会产生副作用:其他应用程序也在那里运行。操作系统调度不同的应用程序并分配CPU上的每个进程时隙。每次执行应用程序时,它都会以不同的顺序执行,并使用不同的其他进程。这会影响总执行时间。