【问题标题】:Trying to compute the time difference to compare two sorting algorithms试图计算时间差来比较两种排序算法
【发布时间】:2020-04-07 13:32:35
【问题描述】:
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);
}

在 main 方法中,我尝试打印 delta 5 次。 当我在循环(注释掉的块)内执行此操作时,增量随着时间的推移而减少,这很奇怪。 当我在循环之外执行此操作时(运行代码 5 次),增量似乎是一致的。 为什么会发生这种情况,我该如何解决? 谢谢。

【问题讨论】:

  • 您的增量获得了哪些价值?它在循环中增加了多少?
  • 使用JMH 进行此类测试。
  • @matt 15, 19, 29, 27, 23 用于循环外。 20,8,9,13,10 for 循环内
  • @ndang6 使用循环时值会减少多少。如果在没有循环的情况下运行您的应用程序需要 15 到 30 毫秒,我不知何故怀疑您是否看到 jvm 预热时间差异。

标签: java time


【解决方案1】:

当您编译您的 java 代码时,它会编译为 java 字节码。当您的程序运行时,它将字节码解释为机器码。大部分代码只运行一次,所以 JVM 只解释一次,不存储机器码。当 JVM 注意到您一遍又一遍地运行相同的代码时,它会将该部分编译为机器代码并尝试尽可能优化。这称为Just-in-time compilation

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

至于准确测量程序的预热性能,我建议您确定 JVM 预热需要多长时间并开始测量。

【讨论】:

    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2014-01-14
    • 2016-04-23
    相关资源
    最近更新 更多