OCaml模块和性能

hec*_*pal 7 ocaml module

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

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

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

问题是:

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

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

Mic*_*and 9

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

  • OCaml本机代码编译器可以执行跨模块内联,因此即使跨越单独的编译单元也可以内联代码(有几个警告 - 递归函数和函数参数不跨模块[1]内联).
  • 代码仍然可能足够快,可读性和可维护性的提高很可能超过任何(边际)性能成本.

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

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