OCaml 例外処理により、例外の発生とキャッチが非常に高速になります。実装方法に関する内部の詳細については、この SO スレッドを参照してください。私はそれを正確にベンチマークするように注意していませんが、私のランダムな推測では、間接関数呼び出しの範囲内にあると思います.
OCaml の例外は、言語の残りの部分に比例して、たとえば F# の例外よりも大幅に高速であることが知られています。これは、コードを OCaml から F# に移植する人々にパフォーマンスの問題を引き起こしました。OCaml では、例外はパフォーマンスの問題を引き起こしません。
Hashtbl.mem
beforeを呼び出すHashtbl.find
と、例外をキャッチするよりも遅くなる可能性があります。慣用的なスタイルはtry Hashtbl.find .. with Not_found -> ...
.
option
そうは言っても、OCaml コミュニティでは、例外ではなく型を使用して、より明示的なエラー処理スタイルを使用するという賢明な動きがあります。理論的根拠はパフォーマンスに基づくものではなく、タイプチェッカーがエラー状況の処理を忘れるのを防ぐという事実に基づいています。新鮮な新しい API を設計するときは、それを好みます。例外を発生させるサードパーティ関数を使用する場合は、考えられるすべての例外をすぐにキャッチしてください。そうしないと、一般的にデザインの臭いがするので、非常に正当化する必要があります。
その便利さから、OCaml 例外は純粋な制御フロー メカニズムとしてもよく使用されます (まれな障害状態を通知するためではありません)。次のようなコードが表示されます。
try
for i = 0 to .... do
if .. then raise Exit
done; false
with Exit -> true
最後に、実装の選択に悪いアプローチを取っている可能性があると感じています。パフォーマンスに関する一般的なマイクロ質問をすることは、通常は行うべき方法ではありません。正確さと読みやすさを第一に考えてください。パフォーマンスに関する質問は、通常は後で、測定可能/プロファイリング可能な状況でのみ行う必要があります。