Попытка вычислить разницу во времени, чтобы сравнить два алгоритма сортировки - PullRequest
0 голосов
/ 07 апреля 2020
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 раз. Когда я сделал это внутри l oop (закомментированный блок), дельта со временем уменьшилась, что странно. Когда я сделал это за пределами l oop (запустил код 5 раз), дельты выглядели согласованными. Почему это происходит и как я могу это исправить? Спасибо.

1 Ответ

0 голосов
/ 07 апреля 2020

Когда вы компилируете свой код java, он компилируется в java байт-код. Когда ваша программа запускается, она интерпретирует байт-код в машинный код. Большинство частей кода выполняется только один раз, поэтому JVM интерпретирует его только один раз и не сохраняет машинный код. Когда JVM замечает, что вы запускаете один и тот же код снова и снова, он компилирует этот раздел в машинный код и пытается оптимизировать так хорошо, как только может. Это называется Компиляция точно в срок .

. Вы можете отключить это и принудительно запускать программу, интерпретируемую с отключенным JIT-компилятором, используя аргумент командной строки -nojit. Это приведет к худшей, но более стабильной производительности.

Что касается точного измерения прогретой производительности программы, я предлагаю вам определить, сколько времени потребуется JVM для прогрева и начала измерения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...