在Ruby中清除数组的最精简/最高效的方法是什么?

在Ruby中清除数组的最精简/最高效的方法是什么?,ruby,garbage-collection,Ruby,Garbage Collection,在批处理过程中,我正在快速填充和清空一个相当大的数组作为缓冲区,我希望在这些操作过程中防止内存泄漏并最大限度地提高速度 当前,我填充数组,然后通过以下方式将其清空: a = [] 我最近刚拿起Ruby来调整一个第三方工具,所以我不知道它的垃圾收集是如何工作的。这是清除数组的最佳方法,还是应该调用 a.clear 阵列#清除速度明显更快 根据我在MRI Ruby 2.1.2下的基准测试,使用它似乎要快得多。请参阅下面的基准代码和结果 基准测试代码 基准测试结果 Ruby中的GC。。?挑战..@

在批处理过程中,我正在快速填充和清空一个相当大的数组作为缓冲区,我希望在这些操作过程中防止内存泄漏并最大限度地提高速度

当前,我填充数组,然后通过以下方式将其清空:

a = []
我最近刚拿起Ruby来调整一个第三方工具,所以我不知道它的垃圾收集是如何工作的。这是清除数组的最佳方法,还是应该调用

a.clear
阵列#清除速度明显更快 根据我在MRI Ruby 2.1.2下的基准测试,使用它似乎要快得多。请参阅下面的基准代码和结果

基准测试代码 基准测试结果
Ruby中的GC。。?挑战..@ArupRakshit那么这是否意味着我应该显式清除,而不是孤立对象引用并等待GC?有一种方法。。但我不知道它有多可信。。等一下,我给你一个链接。检查一下,我对Ruby内部没有太多的经验,所以我不会完全回答这个问题,但我会说:
a=[]
将一个新数组分配给
a
,而
a.clear
会在适当的位置修改数组。您最好调用
a.clear
,因为您不需要等待GC,也不会产生实例化新数组的开销。@fbonetti是正确的
#clear
方法,将只清除数组中的元素,但是如果您真的想要GCed
a
,可以查看我上面给出的链接。非常好--我现在就用clear。也感谢您包含基准测试!这正是我所希望的答案:)你能做
a=nil
而不是
a=[]
并运行你的基准测试吗。使用
a=[]
而不是
nil
有什么意义?@ArupRakshit OP希望将同一变量与一组新数据一起重用为
数组
,因此它必须是
a=nil;a=[]
在这两种情况下,您的代码每次都会重新分配数组-这不是正确地使用
清除
-我想使用
清除
的目的是重用数组,但这就是问题所在-在这个测试中,您永远不会重用“a”-您最好不要调用“a”上的任何内容,因为您在填充时会重新创建它。。。更好的测试是实际填充数组('A
require 'benchmark'

i = 10_000
Benchmark.bmbm do |x| 
  x.report(:literal) { i.times do a = Array.new(i); a = []  end }
  x.report(:clear)   { i.times do a = Array.new(i); a.clear end }
end
Rehearsal -------------------------------------------
literal   0.130000   0.110000   0.240000 (  0.238041)
clear     0.030000   0.010000   0.040000 (  0.026735)
---------------------------------- total: 0.280000sec

              user     system      total        real
literal   0.110000   0.100000   0.210000 (  0.217941)
clear     0.030000   0.000000   0.030000 (  0.025402)