Answers:
是的,gc被摊销为固定时间。假设您有一个算法,该算法在时间上运行,其工作集大小为。现在,请注意,您可以在程序执行期间最多分配字,并且运行复制垃圾收集器的时间成本为(即,gc的成本与总和成正比)实时数据量)。因此,如果您最多运行gc次,则总运行时成本受,这意味着gc的摊销成本是恒定的。因此,如果您有一个Cheney风格的收集器,每个半空间的大小为,那么很容易看到一个完整的收集不能每次都被调用一次以上k O (n )O (k )O (n / k )O (n )2 k n / k k O (k )k步,因为分配单词需要时间,并且工作集永远不会超过大小,这将为您提供所需的界限。这有理由忽略gc问题。
但是,存在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} }
List.map
OCaml中的天真实际上是二次复杂度,因为堆栈深度是线性的,并且每次苗圃撤离时都会遍历堆栈。对于遇到大型指针数组的主要切片也是如此。
我会说您可以忽略垃圾回收。有趣的是,也许我阅读的有关垃圾回收的所有工作都没有提到计算复杂性。这是因为算法的大小为堆大小的,尽管通常它们不会在每次调用时进行完整的堆扫描。
垃圾回收的主要问题不是计算复杂度,而是不可预测性。在考虑实时系统时,这是最相关的。实时垃圾收集方面的许多工作都试图解决此问题。其他人只是放弃了。例如,《 Java实时规范》依赖于程序员指定的区域,无论它们的大小如何,都可以通过成本以编程方式分配和取消分配该区域。
权威的垃圾收集参考是:
Ben Zorn做了一些工作来衡量不同垃圾收集算法的实际成本,尽管以下是最近的论文,它提供了更为全面的比较:
有关更多信息,请参见: