2011-10-22 136 views
1

这样的语言是可行的吗?或者有特定的功能,绝对需要某种形式的gc吗?如果gc是可选的,该怎么办?

注意:我不是反gc,而是来自C/C++后台并在实时服务器应用程序上工作,我更喜欢保持某种程度的控制如何以及何时获得内存(不能有10秒钟的垃圾收集发生在正在运行的中间)。

根据我的要求,我的担心是否现实?或者是gc这么好,我的担忧是没有根据的?

Go的gc是我唯一的一个关于尝试使用我的C++实时服务器端口的预留空间。

+2

你可能会特别提出一个关于如何测量GC运行时影响的单独问题。 –

+1

不知道去,但十秒(!)垃圾收集听起来不太可能与现代技术。几毫秒的可能性更大,并且操作系统通常会因运行病毒扫描程序,唤醒休眠进程和交换虚拟内存而导致延迟。 –

+1

我还没有试过去,但你的要求非常模糊。你自己衡量一下会好得多。根据不同情况,GC算法可能会妨碍您的工作。以这种通用的方式提出问题不会给你一个有用的答案。你能忍受多少中断时间?即使Windows不是实时操作系统。你在谈论真正的实时还是其他? –

回答

3

使用可选的GC将需要更改语言。这里是一个完全有效的运转功能,这将使C程序员的鸡皮疙瘩:

func foo() *int { 
    a := 1 
    return &a 
} 

这是很好的,因为围棋编译器会找出a需要的变量堆上分配。这将是垃圾收集后,你不必在意。 (好的,在某些情况下,你可能会,但大多数情况下你不会)

你可以编译各种场景,编译器会做这样的事情。没有垃圾收集器,它就不会一样。

有些事情可以帮助GC时间,但在某种程度上,您将会取消语言的优势。我毫不犹豫地推荐这些做法,而是选择:

  • 免费名单
  • 随着不安全的包,你甚至可以编写自己的分配器和手动释放内存,但你需要为你希望每个类型的函数分配。或者使用反射来传递你想要分配的类型,返回一个空的接口,并使用类型断言来获取具体值。

底线是,对于具有实时实时要求的应用程序,Go可能不是一个好的选择。也就是说,我也不认为你会看到任何接近10秒的垃圾收集。考虑你的要求是什么,如果你有任何疑问,请做一些测量。

如果可以,请尝试最新的Go代码。有一些垃圾收集器的改进和一些编译器优化,导致更少的分配。但是,如果您的发布时间较短,您可能会坚持几个月的当前稳定版本。

+0

感谢您的建议 - 很高兴听到关于go的新进展。我期望在进行中,我可以通过做大块分配而不是分配许多小对象和编写更紧密的代码来帮助gc ... – kfmfe04

+0

是的,像自由列表这样的东西可以提供帮助。稍微编辑我的答案。 –

+0

@EvanShaw,您可以参考计算GC,参考您提供的示例,并获得确定性运行时间。我认为CPython会重新计算GC,并且如果用户远离循环数据结构,它就会消失。你不能做类似的东西吗? –