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