Ives
Ives

Reputation: 555

Does test order affect performance result?

I wrote 2 blocks of time measurement code. The print result of t1 is always much bigger than t2.
Block1 and block2 do the exact same thing. If I write block 2 before block1, then The print result of t2 is much lesser than t1. I wonder why this happens.

@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)
}

Upvotes: 0

Views: 70

Answers (1)

Januson
Januson

Reputation: 4841

What you are experiencing is called the warmup. The first requests made to a Kotlin (and other JVm based languages) is often substantially slower than the average response time. This warm-up period is caused by lazy class loading and just-in-time compilation.

There are a few ways how to measure performance more reliably. One of them is to create a warmup manually before the test itself is executed. Even more reliable method would be to use a specialized library such as JMH.

Example of manual warmup:

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

// rest of the test

As a side note, Kotlin has built-it functions which you can use instead of manually calculating the time difference. There are measureTimeMillis and measureNanoTime.

It would be used like this:

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

Upvotes: 5

Related Questions