⛳
Scalaの途中リターンは遅いのか
scalaはearly returnが遅いというのをみたので試してみた。
やったこと
trueを返すだけの関数を3つ用意してどれか一つでもtrueならtrueを返す関数を作成。ただし、中身が以下の3通り。
1.early return
2.lazyで変数にして最後にor比較
3.変数にして最後にor比較(非lazy)
ウォームアップ20回、イテレーション回数10回の場合
種別 | 実行結果[μs] |
---|---|
early return | 0.354 |
lazy | 0.529 |
非lazy | 0.237 |
ウォームアップ20回、イテレーション回数1000回の場合
種別 | 実行結果[μs] |
---|---|
early return | 0.218 |
lazy | 0.822 |
非lazy | 0.161 |
考察的な
イテレーション回数が10回、1000回のどちらの結果を見てもlazyが圧倒的に遅いので、呼び出し先の関数が重くない限り(dbアクセスがあるとか)はlazyは使う必要はなさそう。
10回と1000回でearly returnの期待値が変わってくるようで、めちゃくちゃ呼ばれるor呼び出し先の関数がちょっと重い?くらいならearly return使って、そうじゃないなら非lazyを使うのが良さげ。
今回は呼び出し先がtrueを返すだけの関数だったので、次回は呼び出し先の実行時間が増えたときに、今回調べた結果がどうなるのか調べてみようと思う。
以下、検証に使ったコード
earlyReturn
def earlyReturn(): Boolean = {
val a: Boolean = funca()
if (a) {
return true
}
val b: Boolean = funcb()
if (b) {
return true
}
val c: Boolean = funcc()
if (c) {
return true
}
return false
}
lazy
def lazyFunc(): Boolean = {
lazy val a = funca()
lazy val b = funcb()
lazy val c = funcc()
return a || b || c
}
非lazy
def notLazy(): Boolean = {
val a = funca()
val b = funcb()
val c = funcc()
return a || b || c
}
funcaとかの中身。funcb,funccも同一
def funca(): Boolean = {
return true
}
Discussion