我写了 2 block 时间测量代码。 t1的打印结果总是比t2大得多。
Block1 和 block2 执行完全相同的操作。如果我在block1之前写block 2,那么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)
}
最佳答案
您所经历的过程称为热身。对 Kotlin(以及其他基于 JVM 的语言)发出的第一个请求通常比平均响应时间慢得多。这个预热期是由延迟类加载和即时编译引起的。
有几种方法可以更可靠地衡量性能。其中之一是在执行测试之前手动创建预热。更可靠的方法是使用专门的库,例如 JMH .
手动预热示例:
// warmup
for (i in 1..9999) {
val list = (1..100000).toList()
list.filter { it % 7 == 0 }
}
// rest of the test
顺便说一句,Kotlin 有内置函数,您可以使用这些函数来代替手动计算时差。有measureTimeMillis和 measureNanoTime .
它会像这样使用:
val time = measureNanoTime {
list.filter { it % 7 == 0 }
}
关于java - 测试顺序会影响性能结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56625698/