Module OCaml模块与性能

Module OCaml模块与性能,module,ocaml,Module,Ocaml,有些函数很容易在OCaml中实现(例如,从列表映射),但是您可以使用OCaml库的映射:list.map 然而,我们想知道哪种代码更有效。调用单独编译单元(库)的模块可能会导致某些可能的优化无效。我在新闻组fa.caml中读到,当从库中调用函数时,会使用闭包 我在产品中有OCaml代码,它使用模块和函子进行泛型编程。出于历史原因,我的代码是单一的:全部在一个文件中。现在我有了更多的时间,我愿意将代码分离到这些模块的文件中。然而,我担心我会失去表现,因为我花了一段时间才把它做好。例如,我有用于用数

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

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

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

问题是:

  • 如果移动到单独的文件,是否会降低性能
  • OCaml是否对我的代码进行了很多优化,其中包含了模块、函子等

在C++中,如果在A.H中定义类方法,编译器可能会结束内嵌短方法等。在OCAML中使用分离的文件可以实现这一点吗?

< P>您可能会丢失一些性能。然而,有两个缓解因素:

  • OCaml本机代码编译器可以跨模块内联,因此代码甚至可以跨单独的编译单元内联(需要注意的是,递归函数和函数参数不会跨模块内联)
  • 代码仍然很可能足够快,可读性和可维护性方面的收益很可能超过任何(边际)性能成本
我不知道OCaml是否会使同一源文件中定义了函子的代码失效。如果没有,则模块不应添加任何高于函子已经产生的性能影响


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

我对ocaml编译器和链接器的内部结构了解不多,所以我无法回答您的问题。然而,如果将代码分解成模块而导致性能下降,我会非常惊讶。即使您确实损失了几毫秒,代码的清晰性的提高也是值得的。在C/C++中,这可能会导致巨大的差异。我有数百万个对象,访问/比较了无数次。每次访问的一组传统引用可能非常糟糕。是的,但是编译器应该内联这些引用,这样您实际上就不会进行过多的查找。你可以试着用一堆虚拟模块来做一个测试项目,并试着测量把它们分开和保存在同一个文件中是否有区别。这可能比重构您的工作代码库要少得多。希望这能给您带来更多的信心,让您相信ocamlopt能够智能地优化您的代码。谢谢Michael。好消息。当然我知道我会获得可读性。我现在所拥有的并不令人满意。然而,在我的例子中,运行时性能是一个关键问题。我已经花了很多时间从列表切换到阵列(我现在正在使用Res库来增加阵列)。我也有大量的缓存,并仔细选择数据结构。我想我做了我所做的事情,从10分钟或最差的时间降到了10秒。我现在主要关心的是包装数百万对象表示的模块。无论如何我都会拆分,但我需要评估影响,可能不会拆分所有模块。一旦完成代码重构,根据需要有选择地将一些模块移回主文件应该相对容易。