我看到了一些像这样的 OCaml 代码(简化示例):
match x_opt with
| Some x ->
(match do_some_stuff_with_x... with
| Some y -> do_some_stuff_with_y...
| None -> None
)
| None -> None
以下替代方案是否会产生较高的性能成本? (特别是闭包的内存使用情况)?
(* using core_kernel's Option module *)
x_opt
|> Option.bind ~f:(fun x -> do_some_stuff_with_x....)
|> Option.bind ~f:(fun y -> do_some_stuff_with_y....)
可能的答案:
Option.bind
版本的成本可能任意高,具体取决于您关闭的内容- flambda 通常足够聪明,可以优化闭包(就像 rustc 一样)
- 其他
最佳答案
绑定(bind)版本可能会产生创建闭包的少量开销,实际上,flambda 通常会对其进行优化。即使未创建闭包,例如,当绑定(bind)函数未从外部上下文捕获任何内容时(如 Option.bind ~f:Option.return 中所示),也会产生微小的开销额外的电话。
所有这些开销都可以被认为可以忽略不计,除非它们在非常热的循环中运行。因此,除非您进行了分析并发现这是一个问题,否则请尝试使用您认为在给定情况下最具可读性的样式。
关于performance - 与模式匹配相比,是否存在 `Option.bind` 的性能成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74042159/