🔥
(続)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