是否'ok'禁用D的GC?
Is it 'ok' to disable D's GC?
我正在为我创建的字节码制作一个解释器,它需要非常快,为此,我不希望 GC 成为瓶颈,所以我禁用了它,使用 GC.disable();
但我经常在互联网上看到 D 的库需要 GC 在那里,但我并没有使用太多库,我的问题是,如果我使用以下模块中的以下内容,是否可以需要 GC?:
to
来自 std.conv
canFind
来自 std.algorithm
file.read
来自 std.file
File
来自 std.stdio
我正在我的程序中使用上述模块中的上述功能,前提是禁用 GC 是否安全?
您误解了禁用 GC 的作用。
除非你真的把它编译出来,否则 GC 将始终可以通过例如新.
现在了解 GC 工作原理的一些基础知识,当您分配新内存时,它必须确定它是否可以分配,如果不能,它必须尝试清理现有内存才能分配。因此,对于 D 的 GC,只要有分配,它就可以继续收集。现在禁用 GC 只会阻止它继续进行并在分配时进行收集。您始终可以手动促使它这样做。
对于解释器,只要你阻止分配(重用内存),你甚至不需要禁用 GC 来防止它减慢你的速度。所以请记住规则,"big" 分配并重用该内存!
如果您只是想避免调用垃圾回收,诀窍是不创建任何对象供 GC 清理。值得庆幸的是,D 有一个属性可以在编译时进行检查,以确保您不会意外地创建任何垃圾:@nogc
上有一个很好的描述
另请注意,您可以重新打开垃圾收集器,让它收集,然后在您的解释器空闲时再次将其关闭。我在用D做游戏的时候就用了这个技巧,效果很好
// Run the GC when we want
core.memory.GC.enable();
core.memory.GC.collect();
core.memory.GC.disable();
我正在为我创建的字节码制作一个解释器,它需要非常快,为此,我不希望 GC 成为瓶颈,所以我禁用了它,使用 GC.disable();
但我经常在互联网上看到 D 的库需要 GC 在那里,但我并没有使用太多库,我的问题是,如果我使用以下模块中的以下内容,是否可以需要 GC?:
to
来自 std.convcanFind
来自 std.algorithmfile.read
来自 std.fileFile
来自 std.stdio
我正在我的程序中使用上述模块中的上述功能,前提是禁用 GC 是否安全?
您误解了禁用 GC 的作用。 除非你真的把它编译出来,否则 GC 将始终可以通过例如新.
现在了解 GC 工作原理的一些基础知识,当您分配新内存时,它必须确定它是否可以分配,如果不能,它必须尝试清理现有内存才能分配。因此,对于 D 的 GC,只要有分配,它就可以继续收集。现在禁用 GC 只会阻止它继续进行并在分配时进行收集。您始终可以手动促使它这样做。
对于解释器,只要你阻止分配(重用内存),你甚至不需要禁用 GC 来防止它减慢你的速度。所以请记住规则,"big" 分配并重用该内存!
如果您只是想避免调用垃圾回收,诀窍是不创建任何对象供 GC 清理。值得庆幸的是,D 有一个属性可以在编译时进行检查,以确保您不会意外地创建任何垃圾:@nogc
上有一个很好的描述另请注意,您可以重新打开垃圾收集器,让它收集,然后在您的解释器空闲时再次将其关闭。我在用D做游戏的时候就用了这个技巧,效果很好
// Run the GC when we want
core.memory.GC.enable();
core.memory.GC.collect();
core.memory.GC.disable();