为什么.index比.all快?

时间:2013-03-03 21:28:46

标签: ruby performance

以下是两个执行相同操作的简单块:

a = (0..100).to_a

a.all? do |x|
  !(x == 1000)
end

nil == a.index do |x|
  x == 1000
end

除了第二个一直快一点。为什么呢?

                                     user     system      total        real
testing all                      1.140000   0.000000   1.140000 (  1.144535)
testing index                    0.770000   0.000000   0.770000 (  0.769195)

2 个答案:

答案 0 :(得分:5)

原因是indexArray的方法。 Ruby将在项目上迭代(在C中)并依次将它们放到块中。

另一方面,all?none?one?(这些都会慢30%左右)是Enumerable的方法。他们将调用each,这将产生一个C函数,该函数将产生块。时间上的差异是由于涉及两个yield的事实。

请注意all?等的专业版本。可以在Array上定义,你会得到与index相同的效果,但这会有点丑陋和多余......

答案 1 :(得分:1)

这可能是因为在迭代的每个回合中使用!完成了额外的步骤all?