java - 测试顺序会影响性能结果吗?

标签 java kotlin junit

我写了 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 有内置函数,您可以使用这些函数来代替手动计算时差。有measureTimeMillismeasureNanoTime .

它会像这样使用:

val time = measureNanoTime {
    list.filter { it % 7 == 0 }
}

关于java - 测试顺序会影响性能结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56625698/

相关文章:

java - Android Gradle非法规则

java - 当对象调用其父类(super class)的方法时如何处理对象?

java - 将内部存储中的 txt 文件与 dropbox 中的 txt 文件同步 dropbox api

switch-statement - 高效开关需要自认证吗?

java - 如何在 hibernate-validator 中创建可选/可为空的属性?

java - SQL子查询没有返回任何值,但junit测试仍然通过

gradle - 使用 Gradle 对 JUnit 测试进行分组

java - 避免空检查

kotlin - CoroutineScope 的问题(Dispatchers.Main)

java - 使用数据文件进行 Junit 测试