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

Can I realloc an OCaml GC block?

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

a = a ^ b

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

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

没错,OCaml 内存没有 realloc() 风格的原语。

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

在 OCaml 中这不太可能;在年轻的 GC 代中,没有对象跟随它们 space;块按内存递减顺序分配。在老一辈中,你可以到处都有奇怪的洞。如果最近做了compaction,只有最后一个old object 后面可以有free space.

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

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

更新

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