以下是两个执行相同操作的简单块:
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)
答案 0 :(得分:5)
原因是index
是Array
的方法。 Ruby将在项目上迭代(在C中)并依次将它们放到块中。
另一方面,all?
,none?
,one?
(这些都会慢30%左右)是Enumerable
的方法。他们将调用each
,这将产生一个C函数,该函数将产生块。时间上的差异是由于涉及两个yield
的事实。
请注意all?
等的专业版本。可以在Array
上定义,你会得到与index
相同的效果,但这会有点丑陋和多余......
答案 1 :(得分:1)
这可能是因为在迭代的每个回合中使用!
完成了额外的步骤all?
。