performance - 垃圾收集的主要性能提升是什么?

标签 performance garbage-collection

llvm 文档说:

In practice, however, the locality and performance benefits of using aggressive garbage collection techniques dominates any low-level losses.

那么,到底是什么导致了使用垃圾收集而不是手动管理内存时的性能提升呢? (除了明显减少代码编写时间之外)执行堆压缩的好处仅仅是增加空间局部性和缓存利用率吗?还是有其他更有帮助的方法,例如立即删除所有内容?

最佳答案

在现代处理器上,内存缓存才是王道。缓存未命中可能会使处理器停顿数百个 CPU 周期,等待慢速总线提供数据。

使缓存有效需要引用的局部性。换句话说,如果下一次内存访问接近前一次,那么数据已经在缓存中的可能性就很高。

垃圾收集器可以为实现这一目标提供很大帮助。最大的胜利不是集合,而是它重建对象图并重新组织数据结构的能力。压缩。

想象一下典型的数据结构,一个指向对象的指针数组。比如说,从文件中读取一堆字符串并将它们转换为对象的字段值时,它会慢慢建立起来。分配的对象将在地址空间中分散分布。由工作对象分隔的数组指向的长生命周期对象,如字符串。稍后迭代该数组将会非常慢。

直到垃圾收集器运行并重建数据结构。将所有指向的对象按顺序排列。

现在迭代集合非常快,因为访问元素 N 使得元素 N+1 很可能随时可用。如果不在 L1 缓存中,那么 L2 或 L3 的可能性非常大(如果有的话)。

非常大的胜利,它是使垃圾收集与显式内存管理竞争的一个功能。显式类型存在不支持移动对象的问题,因为它会使指针无效。

关于performance - 垃圾收集的主要性能提升是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10643377/

相关文章:

mysql - 查询性能差异

Java - Vector 与 ArrayList 性能 - 测试

java - 监听器垃圾收集说明(Java/Android)

Java 任务控制堆配置文件

php - PHP 闭包对象是否符合垃圾回收条件

go - 如果一个slice的容量被unsafe.Pointer修改了,剩下的内存还能被垃圾回收重用吗?

最便宜的引用结构?

html - wkhtmltopdf 的性能

python - 快速斐波那契计算

python - 为什么 sys.getrefcount() 返回 2?