8

同じことを行う2つの単純なブロックを次に示します。

a = (0..100).to_a

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

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

2番目のものが一貫して少し速いことを除いて。なんで?

                                     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 関数に譲ります。タイミングの違いは、2 つyieldの が関係しているためです。

all?et alの特殊なバージョンに注意してください。で定義できArray、 と同じパフォーマンスが得られますがindex、それは少し見苦しく冗長です...

于 2013-03-04T00:56:47.283 に答える
1

!これは、 を使用した反復の各ターンで実行される余分なステップが原因である可能性がありますall?

于 2013-03-03T21:38:02.747 に答える