Влияет ли порядок тестирования на результат производительности? - PullRequest
0 голосов
/ 17 июня 2019

Я написал 2 блока кода измерения времени. Результат печати t1 всегда намного больше, чем t2 .
Block1 и block2 делают одно и то же. Если я напишу блок 2 перед блоком 1, то результат печати t2 будет намного меньше, чем t1 . Интересно, почему это происходит?

@Test
fun test(){
    val list = (1..100000).toList()

    //block 1
    var t1 = System.nanoTime()
    list.filter { it % 7 == 0 }
    t1 = System.nanoTime() - t1

    //block 2
    var t2 = System.nanoTime()
    list.filter { it % 7 == 0  }
    t2 = System.nanoTime() - t2

    //print
    println(t1)
    println(t2)
}

1 Ответ

5 голосов
/ 17 июня 2019

То, что вы испытываете, называется разминкой.Первые запросы к Kotlin (и другим языкам на основе JVm) часто значительно медленнее, чем среднее время ответа.Этот период прогрева вызван отложенной загрузкой классов и своевременной компиляцией.

Существует несколько способов повысить надежность измерения производительности.Одним из них является создание прогрева вручную перед выполнением самого теста.Еще более надежный способ - использовать специализированную библиотеку, такую ​​как JMH .

Пример ручного прогрева:

// warmup
for (i in 1..9999) {
    val list = (1..100000).toList()
    list.filter { it % 7 == 0 }
}

// rest of the test

В качестве примечания, Котлин имеетэто функции, которые вы можете использовать вместо того, чтобы вручную вычислять разницу во времени.Есть measureTimeMillis и measureNanoTime .

Это будет использоваться следующим образом:

val time = measureNanoTime {
    list.filter { it % 7 == 0 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...