Java 相同的代码块需要不同的持续时间来执行

Java 相同的代码块需要不同的持续时间来执行,java,time,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.currentTime

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

下面是示例代码和输出

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

为什么我得到的执行时间不同?

这可能是对数组列表的即时编译和热点优化,但您不能100%确定


除此之外,您的样本量太小,不太重要。

这可能是为了在数组列表上进行即时编译和热点优化,但您不能100%确定

除此之外,您的样本量太小,不太重要。

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

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

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

a),因为Java代码被编译为字节码,所以对代码进行了一些优化,无论如何,这可能与您的观察结果无关

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


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

您的答案可能会因程序的每次运行而有所不同。。为什么期望完全相同的值?。。旁注:这不是正确的基准测试时间方法。这取决于环境,您无法控制执行时间,这可能因环境而异。此外,每次跑步你可以得到不同的时间。例如,我为您的代码获得以下结果运行1所用时间:1运行2所用时间:0运行3所用时间:1@TheLostMind我被注意到这种行为,并感到好奇。如果你能告诉我是什么环境因素导致了这种行为,那就太好了。@Kajal JIT正在预热,并在以后的运行中更好地优化你的程序。执行的前几秒钟是了解代码如何执行以及如何优化代码。如果您完全编译了代码,则不会发生此行为,因为优化是在运行时之前完成的。您的答案的可能副本可能会因程序的每次运行而有所不同。。为什么期望完全相同的值?。。旁注:这不是正确的基准测试时间方法。这取决于环境,您无法控制执行时间,这可能因环境而异。此外,每次跑步你可以得到不同的时间。例如,我为您的代码获得以下结果运行1所用时间:1运行2所用时间:0运行3所用时间:1@TheLostMind我被注意到这种行为,并感到好奇。如果你能告诉我是什么环境因素导致了这种行为,那就太好了。@Kajal JIT正在预热,并在以后的运行中更好地优化你的程序。执行的前几秒钟是了解代码如何执行以及如何优化代码。如果完全编译代码,则不会发生此行为,因为优化是在运行时之前完成的。当我将条件更改为while时,可能会重复(可变的尝试数字,如10000000,以获得更有趣的结果。在某一点上,您会看到执行速度变快,稍后由于内存管理问题,执行速度会再次变慢。当我将条件更改为while时(可变数字,如10000000,以获得更有趣的结果。在某一点上,您将看到执行速度加快,稍后由于内存管理问题,执行速度将再次减慢。
Run 1
Time taken :6
Run 2
Time taken :3
Run 3
Time taken :1