2014/06/05(木) [n年前の日記]
#2 [ruby] RubyのStructって速度的にはどうなんだろう
上記のスクリプトを書いてた際に、最初は x,y 座標だけを格納するクラスを作って座標管理してたのですけど。速度的によろしくないのかなと配列で管理するようにしちゃったのです。もしかして、クラスじゃなくて Struct を使えば良かったのだろうか…。
と思ってググっていたら、DXRuby作者様が、 _classとStruct - mirichiの日記 において速度測定していて。Ruby 1.9.1 では、Struct のほうがクラスより遅いのか…。
自分も実験。
もちろん、配列ばかり使うと、どこに何の値が入ってるか分かりづらくなるし、途中に何か要素を追加すると修正が大変だし。書きやすさ・メンテナンスと、処理速度の、トレードオフだったりするのかな。
と思ってググっていたら、DXRuby作者様が、 _classとStruct - mirichiの日記 において速度測定していて。Ruby 1.9.1 では、Struct のほうがクラスより遅いのか…。
自分も実験。
# class, Struct, Array のベンチマーク
require 'benchmark'
IDX = 0
class Hoge
attr_accessor :data
def initialize(d = 0)
self.data = d
end
end
Fuga = Struct.new(:data)
Benchmark.bmbm { |x|
x.report("class-new ") { 1000000.times { val = Hoge.new(0) } }
x.report("Struct-new ") { 1000000.times { val = Fuga.new(0) } }
x.report("Array-new ") { 1000000.times { val = [0] } }
val = Hoge.new
x.report("class-data= ") { 1000000.times { val.data = 0 } }
val = Fuga.new
x.report("Struct-data=") { 1000000.times { val.data = 0 } }
a = [0, 0, 0, 0]
x.report("Array-data= ") { 1000000.times { a[IDX] = 0 } }
v = Hoge.new(0)
x.report("=class-data ") { 1000000.times { b = v.data } }
v = Fuga.new(0)
x.report("=class-data ") { 1000000.times { b = v.data } }
a = [0, 0, 0, 0]
x.report("=Array-data ") { 1000000.times { b = a[IDX] } }
}
> ruby --version
ruby 1.9.3p545 (2014-02-24) [i386-mingw32]
> ruby struct_bench.rb
Rehearsal ------------------------------------------------
class-new 0.312000 0.000000 0.312000 ( 0.314018)
Struct-new 0.265000 0.000000 0.265000 ( 0.261015)
Array-new 0.109000 0.000000 0.109000 ( 0.108006)
class-data= 0.172000 0.000000 0.172000 ( 0.175010)
Struct-data= 0.187000 0.000000 0.187000 ( 0.175010)
Array-data= 0.094000 0.000000 0.094000 ( 0.099006)
=class-data 0.078000 0.000000 0.078000 ( 0.077004)
=class-data 0.078000 0.000000 0.078000 ( 0.077005)
=Array-data 0.062000 0.000000 0.062000 ( 0.065004)
--------------------------------------- total: 1.357000sec
user system total real
class-new 0.312000 0.000000 0.312000 ( 0.310017)
Struct-new 0.250000 0.000000 0.250000 ( 0.256015)
Array-new 0.109000 0.000000 0.109000 ( 0.106006)
class-data= 0.171000 0.000000 0.171000 ( 0.177010)
Struct-data= 0.172000 0.000000 0.172000 ( 0.175010)
Array-data= 0.109000 0.000000 0.109000 ( 0.099005)
=class-data 0.078000 0.000000 0.078000 ( 0.078005)
=class-data 0.078000 0.000000 0.078000 ( 0.077004)
=Array-data 0.063000 0.000000 0.063000 ( 0.065004)
生成時に値を渡すなら、Struct のほうが速いのか…。でも、Array を生成するほうが、もっと速いな…。値を代入するのも、読み取るのも、Array のほうが速いっぽい。もちろん、配列ばかり使うと、どこに何の値が入ってるか分かりづらくなるし、途中に何か要素を追加すると修正が大変だし。書きやすさ・メンテナンスと、処理速度の、トレードオフだったりするのかな。
[ ツッコむ ]
以上です。