Анализ Inlining плюс Escape может сделать именно это. Вы можете продемонстрировать это себе, если используете отчеты о компиляции в JVM 7 или сравните два следующих фрагмента кода:
def rfor(i0: Int, i1: Int)(f: Int => Unit) {
var i = i0
while (i <= i1) {
f(i)
i += 1
}
}
def whiley = {
var s = 0
var n = 1
while (n <= 500000000) {
val k = n >> 2
var i = 1
while (i <= 2) {
s += i*k
i += 1
}
n += 1
}
s
}
def rfory = {
var s = 0
var n = 0
while (n <= 500000000) {
val k = n >> 2
rfor(1, 2){ s += k * _ }
n += 1
}
s
}
На моей машине второй, по крайней мере, такой же быстрый, как и первый (иногда быстрее), несмотря на то, что второй, похоже, требует создания функции каждую следующую итерацию.