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);
}
在主要方法中,我尝试打印出delta 5次。当我在循环中做这件事(注释掉块(时,delta随着时间的推移而减少,这很奇怪。当我在循环外执行时(运行代码5次(,delta似乎是一致的。为什么会发生这种情况,我该如何解决?非常感谢。
编译java代码时,它会编译为java字节码。当程序运行时,它将字节码解释为机器代码。大部分代码只运行一次,所以JVM只解释一次,不存储机器代码。当JVM注意到您一遍又一遍地运行相同的代码时,它会将该部分编译为机器代码,并尽可能地进行优化。这称为实时编译。
您可以禁用此功能,并使用命令行参数-nojit
强制程序在禁用JIT编译器的情况下持续运行。这将导致更差但更稳定的性能。
至于准确测量程序的预热性能,我建议您确定JVM预热需要多长时间,然后开始测量。