要素の配列があり、各要素にはプロパティ :image があります。
画像の配列が欲しいので、これを実現するための最も迅速で安価な方法は何ですか。配列を繰り返し処理し、各要素を新しい配列にプッシュするだけですか。次のようになります。
images = []
elements.each {|element| images << element.image}
要素の配列があり、各要素にはプロパティ :image があります。
画像の配列が欲しいので、これを実現するための最も迅速で安価な方法は何ですか。配列を繰り返し処理し、各要素を新しい配列にプッシュするだけですか。次のようになります。
images = []
elements.each {|element| images << element.image}
elements.map {|element| element.image}
これは、お使いのバージョンとほぼ同じパフォーマンスを持つはずですが、やや簡潔で慣用的です。
Benchmark モジュールを使用して、これらの種類のものをテストできます。次のように、元のコードに対して @sepp2k のバージョンを実行しました。
require 'benchmark'
class Element
attr_accessor :image
def initialize(image)
@image = image
end
end
elements = Array.new(500) {|index| Element.new(index)}
n = 10000
Benchmark.bm do |x|
x.report do
n.times do
# Globalkeith's version
image = []
elements.each {|element| image << element.image}
end
end
# sepp2k's version
x.report { n.times do elements.map {|element| element.image} end }
end
私のマシンの出力は一貫して(3回以上実行した後)これに非常に近くなりました:
user system total real
2.140000 0.000000 2.140000 ( 2.143290)
1.420000 0.010000 1.430000 ( 1.422651)
したがってmap
、配列がやや大きく、操作が何度も実行される場合、配列に手動で追加するよりもはるかに高速であることを示しています。