【问题标题】:Is it 'ok' to disable D's GC?禁用 D 的 GC 可以吗?
【发布时间】:2016-08-25 04:26:26
【问题描述】:
我正在为我创建的字节码制作解释器,它需要非常快,为此,我不希望 GC 成为瓶颈,所以我禁用了它,使用 GC.disable();
但我经常在网上看到 D 的库需要 GC 存在,但我并没有使用太多的库,我的问题是,如果我使用以下模块中的以下内容,它是否需要GC?:
-
to 来自 std.conv
-
canFind 来自 std.algorithm
-
file.read 来自 std.file
-
File 来自 std.stdio
我在我的程序中使用上述模块中的功能,前提是禁用 GC 是否安全?
【问题讨论】:
标签:
memory-leaks
garbage-collection
d
【解决方案1】:
您误解了禁用 GC 的作用。
除非您从字面上编译出来,否则 GC 将始终可以通过例如新的。
现在了解 GC 如何工作的一些基础知识,当您分配新内存时,它必须确定它是否可以分配,如果不能,它必须尝试清理现有内存以便能够分配。因此,对于 D 的 GC,只要有分配,它就可以继续收集。现在禁用 GC 只会阻止它继续进行并在分配时进行收集。您可以随时手动煽动它这样做。
对于解释器,只要您阻止分配(重用内存),您甚至不需要禁用 GC 以防止它减慢您的速度。所以请记住规则,“大”分配并重用该内存!
【解决方案2】:
【讨论】:
-
Walter 向a talk 提供了关于编写避免堆分配的基于范围的代码。
【解决方案3】:
还请注意,您可以重新打开垃圾收集器,让它收集,然后在您的解释器空闲时再次将其关闭。我在 D 中制作游戏时使用了这种技术。它非常有效。
// Run the GC when we want
core.memory.GC.enable();
core.memory.GC.collect();
core.memory.GC.disable();