public static void main(String[] args){
int[] nums;
int n = 1000000;
int m = 1000;
List<Long> results = new ArrayList<Long>();
Instant before, after;
long delta;
// for(int i = 0; i < 5; i++){
// nums = IntStream.rangeClosed(1, n).toArray();
// shuffle(nums);
// before = Instant.now();
// findKthSmallest(nums, m);
// quickSort(nums,0 , m-1);
// after = Instant.now();
// delta = Duration.between(before, after).toMillis();
// System.out.println(delta);
// }
nums = IntStream.rangeClosed(1, n).toArray();
shuffle(nums);
before = Instant.now();
findKthSmallest(nums, m);
quickSort(nums,0 , m-1);
after = Instant.now();
delta = Duration.between(before, after).toMillis();
System.out.println(delta);
}
在主要方法中,我尝试打印出5次增量。 当我在循环(注释掉的块)中执行此操作时,增量随着时间的推移而减小,这很奇怪。 当我在循环外执行5次(运行代码5次)时,增量似乎是一致的。 为什么会发生这种情况,我该如何解决? 谢谢。
答案 0 :(得分:0)
编译Java代码时,它将编译为Java字节码。程序运行时,它将字节码解释为机器代码。代码的大部分仅运行一次,因此JVM仅解释一次,并且不存储机器代码。当JVM提示您一次又一次地运行相同的代码时,它会将该部分编译为机器代码,并尽力进行优化。这称为Just-in-time compilation。
您可以禁用此功能,并使用命令行参数-nojit
强制JIT编译器在禁用JIT编译器的情况下持续运行解释程序。这将导致性能下降,但性能会更稳定。
关于准确测量程序的预热性能,建议您确定JVM预热并开始测量所需的时间。