8

这里有两个做同样事情的简单块:

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)
4

2 回答 2

5

原因是那index是一种方法Array。Ruby 将迭代(在 C 中)这些项目,并依次将它们交给块。

另一方面,all?, none?, one?(都会慢 30% 左右)是Enumerable. 他们将调用each,这将屈服于 C 函数,该函数将屈服于块。时间上的差异是因为涉及到两个yields。

请注意,all?等人的专门版本。可以在 上定义Array,您将获得与 相同的性能index,但这会有点丑陋和多余......

于 2013-03-04T00:56:47.283 回答
1

这可能是因为!在迭代的每一轮中使用all?.

于 2013-03-03T21:38:02.747 回答