OCaml模块和性能

时间:2009-11-11 19:07:11

标签: module ocaml

某些函数在OCaml中很容易实现(例如,从列表映射),但您可以使用OCaml库的映射:List.map

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

我在生产中使用了OCaml代码,它使用Modules和Functors进行泛型编程。由于历史原因,我的代码是单一的:全部在一个文件中。现在我有更多时间,我愿意将代码分成这些模块的文件。但是,我担心我会失去性能,因为我花了一段时间才能把它弄好。例如,我有用于使用数字包装复杂对象的模块,因此我强制执行唯一的表示和快速比较。我使用那些带有通用Maps,Sets和构建缓存的包装对象。

问题是:

  • 如果我转移到单独的文件,我会失去性能吗?
  • OCaml是否对我的代码进行了很多优化,包括模块,仿函数等?

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

1 个答案:

答案 0 :(得分:9)

您可能会失去一些表现。但是,有两个缓解因素:

  • OCaml本机代码编译器可以执行跨模块内联,因此即使在单独的编译单元中也可以内联代码(有一些注意事项 - 递归函数和函数参数不会跨模块{{3}进行内联})。
  • 代码仍然可能足够快,可读性和可维护性的提升很可能超过任何(边际)性能成本。

我不知道OCaml是否在同一源文件中定义了仿函数的代码。如果没有,那么模块不应该添加任何高于函子已经产生的性能。

一般来说,我认为最好编写直观,易读,可维护的代码,不要过分担心像这样的微观性能特征,除非代码在实践中证明太慢。