我对Array#flatten方法的性能有两个问题。
下面是一个简单的测试,将flatten方法与自制的naive实现与Enumerable#inject进行比较。
a)我的注入代码如何比原生的flatten实现明显更好 - 我使用的是flatten(1)版本
b)测试中每10行左右观察到的时间峰值是多少?这可能是垃圾收集效果吗?array = (1..3).collect {(1..100).to_a}
30.times {100.times {array.flatten(1)}}
30.times {100.times {array.inject([]) {|a, e| a += e}}}
带有格式化的跟踪代码
30.times {now = Time.now; 100.times {array.flatten(1)}; p "#{(1000 * (Time.now - now)).to_i.to_s.rjust(4)}ms"}
30.times {now = Time.now; 100.times {array.inject([]) {|a, e| a += e}}; p "#{(1000 * (Time.now - now)).to_i.to_s.rjust(4)}ms"}
我在普通的irb和Rails脚本/控制台环境中尝试了这个,结果相同。注入版本明显优于Array#flatten方法。