不可变对象(函数式语言)对GC性能有什么好处吗?

时间:2015-10-28 10:36:43

标签: functional-programming garbage-collection

由于有效利用多核CPU的方式,功能语言越来越受欢迎(因为不变性不变性提供了一些允许进行优化的保证)但是不可变性对垃圾收集器性能有任何好处吗?

UPDATE 在我的搜索过程中,我发现只有一个参数 - 可能在GC算法中避免写入障碍(仅在扫描阶段,当GC在compat / defragmentation阶段我们仍然需要写屏障,但这种情况不常发生。)

2 个答案:

答案 0 :(得分:1)

在没有指针比较的情况下,不可变对象可以通过值传递,因此如果它们可以存在于堆栈中或嵌入在其他对象中,则它们的堆分配可能不是必需的。通过将它们作为可引用对象消除,可以消除GC必须遍历的引用。

使用指针比较不可变对象仍会强制编程样式,以便在某些情况下转义分析/自动堆栈分配更友好。

此外,不可变对象也消除了在公共接口中返回可变数据时可能需要进行防御性复制的需要。

答案 1 :(得分:-1)

虽然我仍然在寻找好处,但我发现了一些反对性能的论据来处理不可变对象。

Bergi 建议调查Haskel内存模型。在这里,不变性需要创建大量的新对象,因此GC有很多工作,但速度更快,但工作量也更大。

我还在这里找到了另一个反对不可变结构的参数(虽然它与GC没有直接关系但与大多数无能的数据结构有关):

http://concurrencyfreaks.blogspot.com/2013/10/immutable-data-structures-are-not-as.html

文章显示适合L2 CPU缓存的大树的例子。修改后的任何可变树只需要 1 节点插入/删除。任何imutalbe树实现都需要将 O(log(N))节点插入/删除到L2缓存中。这可能会大大降低树结构的性能。