这个问题让我做了一些测试:
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);
}
}
Run Code Online (Sandbox Code Playgroud)

与另一篇文章相切,有趣的是,当Object我们比较初始化时,比较的速度要快得多.每个输出中的前两个数字是当Objectis null和后两个数字在Object初始化时.在所有30次执行中,我运行了21次额外的程序执行,Object初始化时的比较速度要快得多.这里发生了什么?
如果将最后两个循环移到开头,您将得到相同的结果,因此比较是无关紧要的。
这都是关于 JIT 编译器预热的。在前 2 个循环中,java从解释字节码开始。经过一些迭代后,它确定代码路径是“热”的,因此它将其编译为机器代码并删除没有效果的循环,因此您基本上是在测量System.nanotime和double算术。
我不太确定为什么两个循环很慢。我认为在找到两条热路径后,它决定优化整个方法。
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |