尝试计算时间差以比较两种排序算法

时间:2020-04-07 13:32:35

标签: java time

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次)时,增量似乎是一致的。 为什么会发生这种情况,我该如何解决? 谢谢。

1 个答案:

答案 0 :(得分:0)

编译Java代码时,它将编译为Java字节码。程序运行时,它将字节码解释为机器代码。代码的大部分仅运行一次,因此JVM仅解释一次,并且不存储机器代码。当JVM提示您一次又一次地运行相同的代码时,它会将该部分编译为机器代码,并尽力进行优化。这称为Just-in-time compilation

您可以禁用此功能,并使用命令行参数-nojit强制JIT编译器在禁用JIT编译器的情况下持续运行解释程序。这将导致性能下降,但性能会更稳定。

关于准确测量程序的预热性能,建议您确定JVM预热并开始测量所需的时间。

相关问题