我可以重新分配OCaml GC块吗?

时间:2015-09-16 21:47:33

标签: garbage-collection ocaml

OCaml memory.h或alloc.h(byterun / caml)中没有realloc。这是否意味着无法重新分配OCaml GC块(或值)?我想到的用例是字符串连接,其中可以使用realloc优化以下内容:

a = a ^ b

在我的基准测试中,字符串concat实际上在PHP(5.5)中比本机编译的OCaml(4.02.1)更快。

编辑:在另一个基准测试中,Buffer 很多比PHP concat快,并且仍然比OCaml concat 甚至更快在每次循环迭代中将缓冲区转换为字符串。 Code

1 个答案:

答案 0 :(得分:3)

这是真的,OCaml内存没有realloc() - 样式原语。

realloc()的效率不是给定的;这取决于电话的模式。一般来说,如果在重新分配的对象之后有空闲空间,它只会节省时间。

在OCaml中,这是不太可能的;在年轻的GC世代中,没有物体跟随它们的自由空间;块按递减的内存顺序分配。在老一辈,你可以在这里和那里有奇怪的洞。如果最近已完成压缩,则只有最后一个旧对象可以在其后面有空闲空间。

出于这些原因,我怀疑realloc()在OCaml GC环境中几乎没有任何好处。

我实际上会怀疑realloc()是你获得PHP的速度比OCaml更快的原因。除非在特殊情况下,否则我认为这不是真正的节省时间。但也许你有一些支持这一理论的测量。

<强>更新

您可能希望尝试使用OCaml Buffer模块,它可以让您强制连接字符串。在许多情况下,缓冲区可能比使用^运算符更快(但具有可变值的通常缺点)。