Ruby 中的垃圾收集器是否考虑了对象的大小和数量?为了优化,我正在考虑用s 或纯es替换Class
实例。我想了解哪些给定的类将对垃圾收集产生最大的影响。Struct
Hash
问问题
69 次
1 回答
0
那个说你应该对它进行基准测试的人是对的——GC 是一个复杂的问题,很难给出 100% 正确的答案。
此外,这取决于所使用的实现。在 JRuby 中,是 JVM 做的工作。在 MRI 中,它是一种标记和扫描 GC。
在 MRI 的情况下,它的工作方式或多或少是这样的:每次 Ruby 解释器需要更多内存时,它都会运行 GC 来尝试释放它。如果没有足够的内存,它会分配更多。当没有对它的引用时,GC 决定一个对象可以被释放(“标记”它)。
我能给你的唯一建议是避免使用大量不能被垃圾收集的对象。例如,如果您正在构建一个字符串数组(它们的大小并不重要),与创建一个连接每个较小字符串的大字符串相比,您应该会看到性能下降的速度要快得多。
这是因为在后者中,GC 可以在使用后销毁小字符串,而在前者中,数组始终保持对它们中的每一个的引用。
编辑:当然,这假设在内存中维护它们的成本大于处理“大字符串”的速度。在某些情况下,最好使用小字符串,然后将它们全部连接起来——这会导致单个操作缓慢。同样,这些只是没有基准的示例,不要太认真。
于 2013-01-31T05:16:22.477 回答