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

Functional programming 不可变对象(函数语言)对GC性能有什么好处吗?,functional-programming,garbage-collection,Functional Programming,Garbage Collection,由于使用多核CPU的有效方法(因为不变性不变量提供了一些允许某些优化的保证),函数式语言越来越流行,但是不变性对垃圾收集器的性能有什么好处吗 更新在搜索过程中,我只找到了一个参数-在GC算法中避免写入障碍的可能性(仅在扫描阶段,当GC处于兼容/碎片整理阶段时,我们仍然需要写入障碍,但这种情况不常发生).当我还在寻找好处时,我发现了一些反对使用不可变对象的性能的论点 Bergi建议研究Haskel记忆模型。在这里,不变性需要创建大量的新对象,因此GC有很多工作要做,虽然速度更快,但工作量也更大 我

由于使用多核CPU的有效方法(因为不变性不变量提供了一些允许某些优化的保证),函数式语言越来越流行,但是不变性对垃圾收集器的性能有什么好处吗


更新在搜索过程中,我只找到了一个参数-在GC算法中避免写入障碍的可能性(仅在扫描阶段,当GC处于兼容/碎片整理阶段时,我们仍然需要写入障碍,但这种情况不常发生).

当我还在寻找好处时,我发现了一些反对使用不可变对象的性能的论点

Bergi建议研究Haskel记忆模型。在这里,不变性需要创建大量的新对象,因此GC有很多工作要做,虽然速度更快,但工作量也更大

我还发现了另一个反对不可变结构的论点(虽然它与GC没有直接关系,但与最重要的数据结构有关):


本文展示了适合二级CPU缓存的大树的示例。修改后的任何可变树只需要插入/删除1个节点。任何imutalbe树实现都需要在二级缓存中插入/删除O(log(N))个节点。这可能会大大降低树结构上的性能。

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

对于指针比较,不可变对象仍然强制使用一种编程风格,这种风格可以更友好地避免某些实例的分析/自动堆栈分配


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

,另请参见“不设置写入障碍”对我来说已经是一个非常有说服力的论点。