У меня есть программа, написанная на Scala. Я хотел измерить время выполнения разных независимых блоков кода. Когда я сделал это очевидным образом (то есть вставил System.nanoTime() до и после каждого блока), я заметил, что время выполнения зависит от порядка блоков. Первые одни блоки всегда занимали больше времени, чем другие.
Я создал минималистичный пример, воспроизводящий это поведение. Все блоки кода одинаковы и для простоты вызывают hashCode() для массива целых чисел.
package experiments
import scala.util.Random
/**
* Measuring execution time of a code block
*
* Minimalistic example
*/
object CodeBlockMeasurement {
def main(args: Array[String]): Unit = {
val numRecords = args(0).toInt
// number of independent measurements
val iterations = args(1).toInt
// Changes results a little bit, but not too much
// val records2 = Array.fill[Int](1)(0)
// records2.foreach(x => {})
for (_ <- 1 to iterations) {
measure(numRecords)
}
}
def measure(numRecords: Int): Unit = {
// using a new array every time
val records = Array.fill[Int](numRecords)(new Random().nextInt())
// block of code to be measured
def doSomething(): Unit = {
records.foreach(k => k.hashCode())
}
// measure execution time of the code-block
elapsedTime(doSomething(), "HashCodeExperiment")
}
def elapsedTime(block: => Unit, name: String): Unit = {
val t0 = System.nanoTime()
val result = block
val t1 = System.nanoTime()
// print out elapsed time in milliseconds
println(s"$name took ${(t1 - t0).toDouble / 1000000} ms")
}
}
После запуска программы с numRecords = 100000 и iterations = 10 моя консоль выглядит так:
HashCodeExperiment занял 14,630283 мс
HashCodeExperiment занял 7,125693 мс
HashCodeExperiment занял 0,368151 мс
HashCodeExperiment занял 0,431628 мс
HashCodeExperiment занял 0,086455 мс
HashCodeExperiment занял 0,056458 мс
HashCodeExperiment
HashCodeExperiment занял 0,055138 мс
заняло 0,062997 мс
HashCodeExperiment заняло 0,063736 мс
HashCodeExperiment заняло 0,056682 мс
Может кто-нибудь объяснить, почему это так? Разве все не должно быть одинаковым? Какое реальное время выполнения?
Большое спасибо,
Питер
Параметры среды:
ОС: ubuntu 14.04 LTS (64-разрядная версия)
IDE: IntelliJ IDEA 2016.1.1 (IU-145.597) em >
Scala: 2.11.7