如何才能获得测试Kotlin中函数性能所需的时间

lmi*_*asf 8 performance kotlin

我需要检查一个函数需要运行多长时间.我有以下功能来解决相同的任务:

mixAnimalsA

fun mixAnimalsA(a1: Animal, a2: Animal) =
        when (setOf(a1, a2)) {
            setOf(Animal.OWL, Animal.Leopard) -> Beast.OWLPARD
            setOf(Animal.ELEPHANT, Animal.BUTTERFLY) -> Beast.BUTTERPHANT
            else -> throw Exception("Not possible combination")
        }
Run Code Online (Sandbox Code Playgroud)

mixAnimalsB

fun mixAnimalsB(a1: Animal, a2: Animal) =
        when (setOf(a1, a2)) {
            (c1 == Animal.OWL && c2 == Animal.Leopard) ||
                    (c2 == Animal.OWL && c1 == Animal.Leopard) -> Beast.OWLPARD
            (c1 == Animal.ELEPHANT && c2 == Animal.BUTTERFLY) ||
                    (c2 == Animal.ELEPHANT && c1 == Animal.BUTTERFLY)-> Beast.BUTTERPHANT
            else -> throw Exception("Not possible combination")
        }
Run Code Online (Sandbox Code Playgroud)

Animal并且Beast是枚举.如何衡量每个函数运行的时间?

zsm*_*b13 19

如果您正在寻找代码内解决方案,您可以使用measureTimeMillismeasureNanoTime,如下所示:

val time = measureTimeMillis {
    // call your function here
}
Run Code Online (Sandbox Code Playgroud)

它们分别以毫秒和纳秒返回测量的时间.

  • 请注意,此方法可能会返回不同的运行结果.对于任何有意义的性能比较,请使用JMH (5认同)

s1m*_*nw1 12

测量块返回结果

我想测量一个方法的时间,我也需要后来的结果.因此我创建了这个函数:

inline fun <R> executeAndMeasureTimeMillis(block: () -> R): Pair<R, Long> {
    val start = System.currentTimeMillis()
    val result = block()
    return result to (System.currentTimeMillis() - start)
}
Run Code Online (Sandbox Code Playgroud)

你可以这样称呼它:

val (response, duration) = executeAndMeasureTimeMillis {
    restTemplate.getForObject<AnyObject>(uri)
}
Run Code Online (Sandbox Code Playgroud)