gpt4 book ai didi

garbage-collection - 我可以重新分配 OCaml GC block 吗?

转载 作者:行者123 更新时间:2023-12-01 02:06:04 26 4
gpt4 key购买 nike

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

a = a ^ b

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

编辑 : 在另一个基准测试中, Buffer比 PHP concat 快得多,即使在每次循环迭代中将缓冲区转换为字符串时,仍然比 OCaml concat 快。 Code .

最佳答案

是真的,没有realloc()用于 OCaml 内存的样式原语。
realloc() 的效率不是给定的;这取决于调用的模式。一般来说,只有在重新分配对象后有可用空间时才可以节省时间。

在 OCaml 中,这不太可能;在年轻的 GC 代中,没有对象有可用空间跟随它们; block 按内存递减顺序分配。在老一代中,你可以到处都有奇怪的洞。如果最近进行了压缩,则只有最后一个旧对象可以在它之后有空闲空间。

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

我实际上倾向于怀疑 realloc()这就是您使用 PHP 获得比 OCaml 更快的时间的原因。我不认为这是一个真正的节省时间,除非在不寻常的情况下。但也许你有一些支持这个理论的测量。

更新

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

关于garbage-collection - 我可以重新分配 OCaml GC block 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32619328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com