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