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
答案 0 :(得分:3)
这是真的,OCaml内存没有realloc()
- 样式原语。
realloc()
的效率不是给定的;这取决于电话的模式。一般来说,如果在重新分配的对象之后有空闲空间,它只会节省时间。
在OCaml中,这是不太可能的;在年轻的GC世代中,没有物体跟随它们的自由空间;块按递减的内存顺序分配。在老一辈,你可以在这里和那里有奇怪的洞。如果最近已完成压缩,则只有最后一个旧对象可以在其后面有空闲空间。
出于这些原因,我怀疑realloc()
在OCaml GC环境中几乎没有任何好处。
我实际上会怀疑realloc()
是你获得PHP的速度比OCaml更快的原因。除非在特殊情况下,否则我认为这不是真正的节省时间。但也许你有一些支持这一理论的测量。
<强>更新强>
您可能希望尝试使用OCaml Buffer
模块,它可以让您强制连接字符串。在许多情况下,缓冲区可能比使用^
运算符更快(但具有可变值的通常缺点)。