18

私はメソッドをほとんど使用しません。代わりに、配列を逆方向にトラバースする必要があるときにreverse_each呼び出します。reverse.eachだから私はちょうどいくつかのベンチマークを行いました、そして明らかreverse_eachによりもかなり速いですreverse.each

  • これは、使用時に逆配列を反復処理する前に逆配列を作成することに関連する時間の要素があるためreverse.eachですか?

ただし、サイズ4の配列に対する1,000万回の反復の私の例(以下)では、TIME(reverse) + TIME(each) - TIME(reverse.each) ~ 1.2 secondsこの時間差は、配列のサイズに関係なく、多かれ少なかれ安定しています。最大100個の要素についてテストしました。

  • この1秒の違いの原因は何ですか?

require 'benchmark'

number = 10000000
arr = (1..4).to_a

Benchmark.bm(13) do |x|
    x.report("reverse.each") { number.times { arr.reverse.each {|x| x} } }
    x.report("reverse_each") { number.times { arr.reverse_each {|x| x} } }
    x.report("reverse")      { number.times { arr.reverse } }             
    x.report("each")         { number.times { arr.each {|x| x} } }        
end
4

2 に答える 2

23

それはかなり簡単です:

  • reverse.each新しい配列を作成してから、各要素をループします

  • reverse_each逆の順序でループします(中間配列は作成されません)

ドキュメントのソースコードを参照してください:http ://www.ruby-doc.org/core-1.9.3/Array.html#method-i-reverse_each

于 2012-10-12T13:01:01.407 に答える
9

逆配列の作成に関連する時間と関係があることは間違いありません!本当に小さな配列しか試していません(100個の要素を持つ配列はまだ小さな配列です)。より大きな配列(たとえば、10k要素)を試してみると、違いに本当に気付くと思います。

于 2012-10-12T12:59:45.470 に答える