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