🔥

(続)Scalaの途中リターンは遅いのか

に公開

概要

こちらの記事の続き。

ググってみるとearly returnはコンパイル後のコードを見ると例外を発生させているらしく遅いらしい。参考

なので前回は「early return」「lazy」「非lazy」の3パターンでtrueのみを返す関数でどうなるか試してみた。
結果は試行回数によるが基本は「非lazy」「early return」「lazy」の順に遅くなった。(ただし試行回数が増えるとearly returnが早くなる。詳細は前回の記事を見てほしい)

で、今回やったことだが、前回trueを返すだけの関数で試したが、今回は何かしらの処理が実行されることを想定してsleepさせる。
前回と同じく3つ関数があるが、最初の関数でtrueが返るので残りの2つは実行しなくて良い想定である。
ただし、想定内容ごとの処理時間については生成AI君が出してくれたものなのであくまで目安と考えてほしい。

結果

[ウォームアップ20回ベンチマーク回数10回]

想定内容 処理時間 early return lazy 非lazy
ちょっとしたif文 5ナノ秒 0.621 μs 0.658 μs 0.658 μs
標準出力への書き込み(println("hello world") 5マイクロ秒 5.500 μs 5.571 μs 15.554 μs
単純なインメモリDBへのクエリ 100マイクロ秒 100.404 μs 100.579 μs 300.530 μs
ネットワーク経由のDBアクセス 10ミリ秒 10000.554 μs 10000.559 μs 30004.533 μs

考察的な

処理時間という観点で見るとearly returnは決して遅くはなさそう。
あとは読みやすさとか、lazy使うと再計算されないっぽいのでその辺とどう付き合うかが大事な気がする。

Discussion