module - OCaml 模块和性能

标签 module ocaml

有些功能在 OCaml 中非常容易实现(例如,从列表中映射),但您可以使用 OCaml 库的映射:List.map

但是,我们可能想知道哪种代码会更高效。调用单独编译单元(库)的模块可能会使某些可能的优化无效。我在新闻组 fa.caml 中读到,当从库中调用函数时,会使用闭包。

我在生产中有 OCaml 代码,使用模块和仿函数进行通用编程。由于历史原因,我的代码是单一的:全部在一个文件中。现在我有更多时间,我愿意将代码分离到此类模块的文件中。然而,我担心我可能会失去性能,因为我花了一段时间才把它做好。例如,我有用数字包装复杂对象的模块,因此我强制执行唯一的表示和快速比较。我将这些包装对象与通用映射、集合一起使用,并在它们之上构建缓存。

问题是:

  • 如果转移到单独的文件,性能是否会下降?
  • OCaml 是否对我的充满模块、仿函数等的代码进行了许多优化?

在 C++ 中,如果在 .h 中定义类方法,编译器可能最终会内联短方法等。是否可以在 OCaml 中使用单独的文件来实现这一点?

最佳答案

您可能会损失一些性能。但是,有两个缓解因素:

  • OCaml native 代码编译器可以进行跨模块内联,因此即使跨单独的编译单元也可以内联代码(有一些注意事项 - 递归函数和函数参数不会跨模块内联 [1] ) .
  • 代码仍然很可能足够快,并且可读性和可维护性方面的 yield 很可能超过任何(边际)性能成本。

我不知道 OCaml 是否会对在同一源文件中定义仿函数的代码进行解函。如果没有,那么模块不应增加任何高于仿函数已经产生的性能影响。

总的来说,我认为最好编写简单、可读、可维护的代码,不要过多担心像这样的微观性能特征,除非代码在实践中被证明太慢。

关于module - OCaml 模块和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1717386/

相关文章:

java - IntelliJ IDEA 中的 "Module Dependencies"和 "Libraries"有什么区别?

python - 导入中断,因为库无法导入自己的模块

TypeScript:指定目录以查找模块类型定义

ocaml - 如何在另一个 .ml 文件中访问一个 .ml 文件中定义的类型

ocaml - camlp4 语法扩展,解析器错误

python - 如何使用其完全限定名称调用 Python 方法?

javascript - Angular 错误: [$injector:unpr] Filtering Error

functional-programming - 为什么产品比记录使用更多的内存?

javascript - 任意类型的函数调用

scala - 用于 Ocaml 和其他语言的基于 Actor 的分布式并发库