试图计算时间差来比较两种排序算法


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预热需要多长时间,然后开始测量。

最新更新