相同的代码块需要不同的持续时间才能执行

时间:2016-03-30 06:22:52

标签: java time

我试图用类似的块来检查执行的时间。

示例代码和输出如下,

    public class Tester {

    public static void main(String[] args) {
        System.out.println("Run 1");
        List<Integer> list = new ArrayList<>();
        int i = 0;
        long st = System.currentTimeMillis();
        while (++i < 10000) {
            list.add(i);
        }
        System.out.println("Time taken :" + (System.currentTimeMillis() - st));

        System.out.println("Run 2");
        int j = 0;
        List<Integer> list2 = new ArrayList<>();
        long ST = System.currentTimeMillis();
        while (++j < 10000) {
            list2.add(j);
        }
        System.out.println("Time taken :" + (System.currentTimeMillis() - ST));

        System.out.println("Run 3");
        int k = 0;
        List<Integer> list3 = new ArrayList<>();
        long ST2 = System.currentTimeMillis();
        while (++k < 10000) {
            list3.add(k);
        }
        System.out.println("Time taken :" + (System.currentTimeMillis() - ST2));
    }
}

输出

Run 1
Time taken :6
Run 2
Time taken :3
Run 3
Time taken :1

为什么我会有不同的执行时间?

2 个答案:

答案 0 :(得分:1)

这可能是在阵列列表上进行即时编译和热点优化,但你无法100%确定。

除此之外,您的样本量太小而不显着。

答案 1 :(得分:1)

a)由于java代码被编译为字节码,因此对代码进行了一些优化,无论如何这可能与您的观察没有关系

b)由于例如JVM延迟加载或CPU缓存,每个后续类似操作都有更好的执行时间,直到jvm为该操作“预热”为止。

c)如果您想尝试基准测试,请查看Java Microbenchmark线束(JMH)