mieki256's diary



2014/06/05(木) [n年前の日記]

#2 [ruby] RubyのStructって速度的にはどうなんだろう

上記のスクリプトを書いてた際に、最初は x,y 座標だけを格納するクラスを作って座標管理してたのですけど。速度的によろしくないのかなと配列で管理するようにしちゃったのです。もしかして、クラスじゃなくて 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 のほうが速いっぽい。

もちろん、配列ばかり使うと、どこに何の値が入ってるか分かりづらくなるし、途中に何か要素を追加すると修正が大変だし。書きやすさ・メンテナンスと、処理速度の、トレードオフだったりするのかな。

以上です。

過去ログ表示

Prev - 2014/06 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project