【问题标题】:Is it 'ok' to disable D's GC?禁用 D 的 GC 可以吗?
【发布时间】:2016-08-25 04:26:26
【问题描述】:

我正在为我创建的字节码制作解释器,它需要非常快,为此,我不希望 GC 成为瓶颈,所以我禁用了它,使用 GC.disable();

但我经常在网上看到 D 的库需要 GC 存在,但我并没有使用太多的库,我的问题是,如果我使用以下模块中的以下内容,它是否需要GC?:

  1. to 来自 std.conv
  2. canFind 来自 std.algorithm
  3. file.read 来自 std.file
  4. File 来自 std.stdio

我在我的程序中使用上述模块中的功能,前提是禁用 GC 是否安全?

【问题讨论】:

    标签: memory-leaks garbage-collection d


    【解决方案1】:

    您误解了禁用 GC 的作用。 除非您从字面上编译出来,否则 GC 将始终可以通过例如新的。

    现在了解 GC 如何工作的一些基础知识,当您分配新内存时,它必须确定它是否可以分配,如果不能,它必须尝试清理现有内存以便能够分配。因此,对于 D 的 GC,只要有分配,它就可以继续收集。现在禁用 GC 只会阻止它继续进行并在分配时进行收集。您可以随时手动煽动它这样做。

    对于解释器,只要您阻止分配(重用内存),您甚至不需要禁用 GC 以防止它减慢您的速度。所以请记住规则,“大”分配并重用该内存!

    【讨论】:

      【解决方案2】:

      如果您只是想避免调用垃圾回收,诀窍是不要创建任何对象供 GC 清理。幸运的是,D 有一个属性可以在编译时检查以确保您不会意外创建任何垃圾:@nogc

      有一个很好的描述:http://ddili.org/ders/d.en/functions_more.html

      【讨论】:

      • Walter 向a talk 提供了关于编写避免堆分配的基于范围的代码。
      【解决方案3】:

      还请注意,您可以重新打开垃圾收集器,让它收集,然后在您的解释器空闲时再次将其关闭。我在 D 中制作游戏时使用了这种技术。它非常有效。

      // Run the GC when we want
      core.memory.GC.enable();
      core.memory.GC.collect();
      core.memory.GC.disable();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2019-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多