0

Ruby 中的垃圾收集器是否考虑了对象的大小和数量?为了优化,我正在考虑用s 或纯es替换Class实例。我想了解哪些给定的类将对垃圾收集产生最大的影响。StructHash

4

1 回答 1

0

那个说你应该对它进行基准测试的人是对的——GC 是一个复杂的问题,很难给出 100% 正确的答案。

此外,这取决于所使用的实现。在 JRuby 中,是 JVM 做的工作。在 MRI 中,它是一种标记和扫描 GC。

在 MRI 的情况下,它的工作方式或多或少是这样的:每次 Ruby 解释器需要更多内存时,它都会运行 GC 来尝试释放它。如果没有足够的内存,它会分配更多。当没有对它的引用时,GC 决定一个对象可以被释放(“标记”它)。

我能给你的唯一建议是避免使用大量不能被垃圾收集的对象。例如,如果您正在构建一个字符串数组(它们的大小并不重要),与创建一个连接每个较小字符串的大字符串相比,您应该会看到性能下降的速度要快得多。

这是因为在后者中,GC 可以在使用后销毁小字符串,而在前者中,数组始终保持对它们中的每一个的引用。

编辑:当然,这假设在内存中维护它们的成本大于处理“大字符串”的速度。在某些情况下,最好使用小字符串,然后将它们全部连接起来——这会导致单个操作缓慢。同样,这些只是没有基准的示例,不要太认真。

于 2013-01-31T05:16:22.477 回答