Rubyでオブジェクトを管理する際、何でもArrayにぶち込んでぶん回すみたいなことをよくやるのですが、その際新規のオブジェクトをpushするか<<するかで何か違いがでるのか疑問に思ったのでためしてみました。

ちなみにArray#pushもArray#<<もやることは配列の末尾に引数のオブジェクトを追加するだけです。便利ですね。

動作環境はWindowsXPruby-1.9.1-p378-i386-mingw32です

# encoding: cp932

now = Time.new
ary = Array.new
puts "push()の速度検証を行います"
print "10000000回pushした実行時間は"
10000000.times do |i|
  ary.push(i)
end
puts "#{Time.new - now} + 秒です\n\n"

now = Time.new
ary = Array.new
puts "<<の速度検証を行います"
print "10000000回<<した実行時間は"
10000000.times do |i|
  ary << i
end
puts "#{Time.new - now} + 秒です"

で、結果がこちら。

push()の速度検証を行います
10000000回pushした実行時間は3.890625 + 秒です

<<の速度検証を行います
10000000回<<した実行時間は2.953125 + 秒です

この結果を見る限り、<<のほうが早いみたいですね。
Twitterで疑問を投げかけたところ、1.9のVMが<<にだけ最適化されているらしいです。

大量のオブジェクトをpushするゲームプログラムだと、地味に効いてきそうなので、気をつけようと思います。