This question带领我做了一些测试:
public class Stack
{
public static void main(String[] args)
{
Object obj0 = null;
Object obj1 = new Object();
long start;
long end;
double difference;
double differenceAvg = 0;
for (int j = 0; j < 100; j++)
{
start = System.nanoTime();
for (int i = 0; i < 1000000000; i++)
if (obj0 == null);
end = System.nanoTime();
difference = end - start;
differenceAvg +=difference;
}
System.out.println(differenceAvg/100);
differenceAvg = 0;
for (int j = 0; j < 100; j++)
{
start = System.nanoTime();
for (int i = 0; i < 1000000000; i++)
if (null == obj0);
end = System.nanoTime();
difference = end - start;
differenceAvg +=difference;
}
System.out.println(differenceAvg/100);
differenceAvg = 0;
for (int j = 0; j < 100; j++)
{
start = System.nanoTime();
for (int i = 0; i < 1000000000; i++)
if (obj1 == null);
end = System.nanoTime();
difference = end - start;
differenceAvg +=difference;
}
System.out.println(differenceAvg/100);
differenceAvg = 0;
for (int j = 0; j < 100; j++)
{
start = System.nanoTime();
for (int i = 0; i < 1000000000; i++)
if (null == obj1);
end = System.nanoTime();
difference = end - start;
differenceAvg +=difference;
}
System.out.println(differenceAvg/100);
}
}

与other post无关的是,有趣的是,当我们比较的Object被初始化时,比较速度要快得多。每个输出中的前两个数字是在Object为null时,后两个数字是在Object初始化时。我额外执行了21次程序,在所有30次执行中,当Object初始化时,比较速度要快得多。这里发生了什么事?
发布于 2013-06-17 18:18:49
如果您将最后两个循环移到开始处,您将获得相同的结果,因此比较是不相关的。
这一切都是关于JIT编译器的预热。在前两个循环中,java从解释字节码开始。经过一些迭代后,它确定代码路径是“热的”,因此它将其编译为机器码,并删除无效的循环,因此您基本上是在测量System.nanotime和double算法。
我真的不太确定为什么两个循环都很慢。我认为在找到两条热路径后,它决定对整个方法进行优化。
https://stackoverflow.com/questions/17144457
复制相似问题