performance - 与模式匹配相比,是否存在 `Option.bind` 的性能成本?

标签 performance pattern-matching ocaml ocaml-core

我看到了一些像这样的 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/

相关文章:

php - 使用 PHP 类对象与静态类方法相比有任何开销吗?

mysql - 使用计数(不同)查询运行选择时如何加快 mysql 查询

algorithm - 在一组间隔中查找间隔模式

ocaml - 如何缩进现有的 OCaml 代码

c++ - 为什么缓存读取未命中比写入未命中快?

R data.table 加速 SI/公制转换

haskell - 如何递归地将函数转换为cps

haskell - 模式匹配中的 Monoid mempty

ocaml - 使用 dune 将生成的可执行文件复制到我的根目录中

types - OCaml 前向声明