分析垃圾收集的编程语言中指定的最坏情况数据结构的运行时间时,可以忽略GC的成本吗?


22

我只是意识到我一直以为我的问题的答案是“是”,但我没有充分的理由。我想象也许有一个垃圾收集器,可证明只引入了最坏情况的减速。有没有我可以引用的权威参考文献?就我而言,如果这些细节很重要,那么我将使用纯功能数据结构,并使用Standard ML。O(1)

当应用于例如Java中指定的数据结构时,也许这个问题会更加相关?使用Java的算法/数据结构教科书中可能有一些相关的讨论?(我知道Sedgewick具有Java版本,但是我只能访问C版本。)

Answers:


17

是的,gc被摊销为固定时间。假设您有一个算法,该算法在时间上运行,其工作集大小为。现在,请注意,您可以在程序执行期间最多分配字,并且运行复制垃圾收集器的时间成本为(即,gc的成本与总和成正比)实时数据量)。因此,如果您最多运行gc次,则总运行时成本受,这意味着gc的摊销成本是恒定的。因此,如果您有一个Cheney风格的收集器,每个半空间的大小为,那么很容易看到一个完整的收集不能每次都被调用一次以上k O n O k O n / k O n 2 k n / k k O k knkO(n)O(k)O(n/k)O(n)2kn/k步,因为分配单词需要时间,并且工作集永远不会超过大小,这将为您提供所需的界限。这有理由忽略gc问题。kO(k)k

但是,存在gc的存在或不存在是不可忽略的一种情况是在编写无锁数据结构时。许多现代的无锁数据结构故意泄漏内存,并依靠gc来确保正确性。这是因为从较高的层次上讲,它们的工作方式是复制一些数据,对其进行更改,并尝试使用CAS指令以原子方式对其进行更新,然后循环运行直到CAS成功。在这些算法中添加确定性的释放分配会使它们更加复杂,因此人们通常不会打扰(尤其是因为它们通常针对的是类似Java的环境)。

编辑:如果您想要未摊销的范围,Cheney收集器将不会执行此操作-每次调用时,它将扫描整个实时设置。Google的关键字是“实时垃圾收集”,Djikstra 等人。斯蒂尔提供了第一个实时标记扫掠收集器,贝克提供了第一个实时压缩收集器。

@article {dijkstra1978fly,
  title = {{即时垃圾收集:合作中的练习}},
  作者= {Dijkstra,EW和Lamport,L.和Martin,AJ和Scholten,CS和Steffens,EFM},
  journal = {ACM的通讯},
  音量= {21},
  数字= {11},
  页面= {966--975},
  issn = {0001-0782},
  year = {1978},
  发布者= {ACM}
}

@article {steele1975multiprocessing,
  title = {{多处理压缩垃圾收集}},
  author = {Steele Jr,GL},
  journal = {ACM的通讯},
  音量= {18},
  数字= {9},
  页面= {495--508},
  issn = {0001-0782},
  年= {1975},
  发布者= {ACM}
}

@article {baker1978list,
  title = {{在串行计算机上实时进行列表处理}},
  author = {Baker Jr,HG},
  journal = {ACM的通讯},
  音量= {21},
  数字= {4},
  页面= {280--294},
  issn = {0001-0782},
  year = {1978},
  发布者= {ACM}
}

多亏了这个线索,我才从Wikipedia上了解了切尼风格的收藏家。如果堆足够大,您是否可以确认Cheney样式的收集器可以与它收集的任何算法相吻合?通过燕尾榫,我的意思是这样的收集器可以在后台逐步执行,一次工作一个单元。(更确切地说,对于某些值和,后每在前台算法指令,执行在后台集电极说明。)b a babab
小牛佑

1
“是的,gc被摊销为固定时间”。通常这是不正确的。您可能会争辩说GC 可以,但不一定如此,真正的GC 不一定如此。例如,List.mapOCaml中的天真实际上是二次复杂度,因为堆栈深度是线性的,并且每次苗圃撤离时都会遍历堆栈。对于遇到大型指针数组的主要切片也是如此。
乔恩·哈罗普

12

我会说您可以忽略垃圾回收。有趣的是,也许我阅读的有关垃圾回收的所有工作都没有提到计算复杂性。这是因为算法的大小为堆大小的,尽管通常它们不会在每次调用时进行完整的堆扫描。O(n)

垃圾回收的主要问题不是计算复杂度,而是不可预测性。在考虑实时系统时,这是最相关的。实时垃圾收集方面的许多工作都试图解决此问题。其他人只是放弃了。例如,《 Java实时规范》依赖于程序员指定的区域,无论它们的大小如何,都可以通过成本以编程方式分配和取消分配该区域。O(1)

权威的垃圾收集参考是:

  • Richard Jones和Rafael Lin的垃圾收集

Ben Zorn做了一些工作来衡量不同垃圾收集算法的实际成本,尽管以下是最近的论文,它提供了更为全面的比较:

有关更多信息,请参见:

  • 垃圾收集的统一理论,Bacon,Cheng和Rajan,ACM面向对象编程,系统,语言和应用程序会议,加拿大不列颠哥伦比亚省温哥华,2004年,第50-68页。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.