8

这个问题让我做了一些测试:

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);      
    }
}

在此处输入图像描述

与另一篇文章相切,有趣的是,当Object我们正在比较的 被初始化时,比较的速度有多快。每个输出中的前两个数字是什么时候Objectnull后两个数字是什么时候Object被初始化。Object我运行了 21 次额外的程序执行,在所有 30 次执行中,初始化时比较快得多。这里发生了什么?

4

1 回答 1

3

如果将最后两个循环移到开头,您将得到相同的结果,因此比较无关紧要。

这都是关于 JIT 编译器预热的。在前 2 个循环java中,从解释字节码开始。经过一些迭代,它确定代码路径是“热”的,因此将其编译为机器码并删除没有效果的循环,因此您基本上是在测量System.nanotimedouble算术。

我不太确定为什么两个循环很慢。我认为在找到两条热门路径后,它决定优化整个方法。

于 2013-06-17T10:18:48.600 回答