По состоянию на январь 2014 года
Текущему бенчмарку исполнилось ~ 3 года, и Hotspot и компилятор значительно эволюционировали. Я также использую Google Caliper для выполнения тестов.
код
import com.google.caliper.SimpleBenchmark
class Benchmark extends SimpleBenchmark {
def timeRaw(reps: Int) = {
var i = 0
var result = 0L
while (i < reps) {
result += 0xc37e ^ (i * 0xd5f3)
i = i + 1
}
result
}
def normal(i: Int): Long = 0xc37e ^ (i * 0xd5f3)
def timeNormal(reps: Int) = {
var i = 0
var result = 0L
while (i < reps) {
result += normal(i)
i = i + 1
}
result
}
def timeInner(reps: Int) = {
def inner(i: Int): Long = 0xc37e ^ (i * 0xd5f3)
var i = 0
var result = 0L
while (i < reps) {
result += inner(i)
i = i + 1
}
result
}
def timeClosure(reps: Int) = {
var i = 0
var result = 0L
val closure = () => result += 0xc37e ^ (i * 0xd5f3)
while (i < reps) {
closure()
i = i + 1
}
result
}
def normal(i: Int, j: Int, k: Int, l: Int): Long = i ^ j ^ k ^ l
def timeUnboxed(reps: Int) = {
var i = 0
var result = 0L
while (i < reps) {
result += normal(i,i,i,i)
i = i + 1
}
result
}
val closure = (i: Int, j: Int, k: Int, l: Int) => (i ^ j ^ k ^ l).toLong
def timeBoxed(reps: Int) = {
var i = 0
var result = 0L
while (i < reps) {
closure(i,i,i,i)
i = i + 1
}
result
}
}
Результаты
benchmark ns linear runtime
Normal 0.576 =
Raw 0.576 =
Inner 0.576 =
Closure 0.532 =
Unboxed 0.893 =
Boxed 15.210 ==============================
Что очень удивительно, так это то, что тест на закрытие был выполнен примерно на 4 нс быстрее, чем остальные. Похоже, что это идиосинкразия Hotspot вместо среды выполнения, несколько прогонов вернули одну и ту же тенденцию.
Использование замыкания, которое выполняет упаковку, является огромным ударом по производительности, для выполнения одной распаковки и повторной упаковки требуется около 3,579 нс, что достаточно для выполнения множества примитивных математических операций. В этой конкретной ситуации ситуация может улучшиться с работой нового оптимизатора . В общем случае бокс можно облегчить с помощью минибокс .
Edit:
Новый оптимизатор здесь не особо помогает, он замедляет Closure
0,1 нс и быстрее Boxed
0,1 нс:
benchmark ns linear runtime
Raw 0.574 =
Normal 0.576 =
Inner 0.575 =
Closure 0.645 =
Unboxed 0.889 =
Boxed 15.107 ==============================
Выполняется с 2.11.0-20131209-220002-9587726041 от magarciaEPFL / scala
Версия
1034 * JVM *
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
Scalac
Scala compiler version 2.10.3 -- Copyright 2002-2013, LAMP/EPFL