【问题标题】:Using D for a realtime application?将 D 用于实时应用程序?
【发布时间】:2013-05-21 11:25:13
【问题描述】:

我正在考虑将 d 用于我正在进行的图形引擎。让我失望的一件事是 GC。

我还是一个年轻的程序员,我可能对 GC 有很多误解,希望你能澄清一些顾虑。

我的目标是低延迟,而时间通常是至关重要的。据我所知,GC 是非常不可预测的,例如,我的应用程序可以每 16.6 毫秒渲染一帧,而 GC 何时启动它可能会上升到 30 毫秒之类的任何数字,因为它不是确定性的吗?

我读到您可以在 D 中关闭 GC,但是您不能使用 D 的大多数标准库,并且 GC 并未完全关闭。这是真的吗?

您认为在时间关键型应用程序中使用 D 有意义吗?

【问题讨论】:

  • 显然现在有一个并发 GC 可以大大减少暂停并用于需要“低延迟”的系统:reddit.com/r/programming/comments/1eovfu/…
  • 这是一个使用D1的研究项目;这在这里并没有真正的帮助。不过,有些讨论是相关的。
  • 一个建议,因为你正在学习:首先专注于完成这件事,然后才关注它的速度——前者已经够难了! (恕我直言,无论哪种方式,使用 D 都有意义)
  • @vines 我实际上只是在做一些研究。我没有仔细看D。目前我正在研究 Rust,它似乎比 D 更适合我的任务。
  • @MaikKlein 我倾向于同意,目前 Rust 感觉更适合这种给定的语言设计和自己的核心决策。但是,它仍处于非常早期的开发阶段,类似于 D 大约 3 年前的情况。

标签: garbage-collection d


【解决方案1】:

简答:需要大量定制,如果您不是经验丰富的 D 开发人员,可能会非常困难。

问题列表:

内存管理本身并不是什么大问题。在实时应用程序中,您永远不想在主循环中分配内存。为所有主要数据预先分配内存池几乎是执行此类应用程序的事实上的标准方法。从这个意义上说,D 并没有什么不同——你仍然直接调用 C malloc 来为你的池获取一些堆,并且这个内存不会由 GC 管理,它甚至不会知道它。

但是,某些语言特性和 Phobos 的大部分确实会自动使用 GC。例如,如果没有某种形式的自动管理分配,您就无法真正连接切片。而火卫一很长一段时间都没有对此制定过强有力的政策。

很少有语言触发的分配本身不会成为问题,因为大多数使用的内存都是通过池进行管理的。但是,库存 D 中的实时软件存在一个致命问题:默认的 D 垃圾收集器是 stop-the-world。即使几乎没有垃圾,您的整个程序也会在运行收集周期时遇到延迟峰值,因为所有线程都会被阻塞。

可以做什么:

1) 使用GC.disable(); 关闭收集周期。它将解决 stop-the-world 问题,但现在您的程序在某些情况下会开始泄漏内存,因为基于 GC 的分配仍然有效。

2) 转储隐藏的 GC 分配。我现在找不到-vgc 开关的拉取请求,但在没有它的情况下,您可以编译自己的运行时版本,在gc_malloc() 调用时打印回溯。您可能希望将其作为自动测试套件的一部分运行。

3) 完全避免使用 Phobos,并使用 https://bitbucket.org/timosi/minlibd 之类的东西作为替代。

做这一切应该足以满足游戏开发者典型的软实时要求,但正如您所见,这根本不简单,需要退出 D 发行版。

未来的选择:

一旦 Leandro Lucarella 将他的 concurrent garbage collector 移植到 D2(这是计划中的,但未计划),情况将变得更加简单。少量 GC 管理的内存 + 并发实现即使不禁用 GC 也能满足软实时要求。即使是 Phobos 在从最烦人的分配中剥离后也可以使用。但我认为这不会很快发生。

但是硬实时呢?

你最好不要尝试。但这又是另一个故事了。

【讨论】:

    【解决方案2】:

    如果你不喜欢 GC - 禁用它。

    方法如下:

    import core.memory;
    
    void main(string[] args) {
        GC.disable;
        // your code here
    }
    

    当然,您必须自己管理内存。这是可行的,并且有几篇关于它的文章。这里也讨论过,只是不记得主题了。

    dlang.org 也有这方面的有用信息。这篇 http://dlang.org/memory.html 的文章涉及到实时编程的话题,你应该阅读它。

    又一篇好文章:http://3d.benjamin-thaut.de/?p=20.

    【讨论】:

    • 据我所知,GC 仍然会运行,即使它被禁用。你能确认或否认这一点吗?如果禁用 GC,我仍然无法使用 90% 的 std 库,这仍然是真的吗?
    • 它不会运行,因为收集周期永远不会运行,但它仍然存在并在请求时分配内存。出于这个原因,您将能够使用禁用 GC 的 std 库,但它会像地狱一样泄漏。
    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2018-12-30
    • 2014-01-14
    • 2015-03-24
    • 1970-01-01
    • 2017-12-20
    相关资源
    最近更新 更多