速度を測る

ruby向きではない?

W = 400

def update(as)
  as.each_with_index {|row,y|
    row.each_with_index{|c,x|
      yield( c, x,y)
    }
  }
end

def get_time()
  Process.times.utime
end

a = Array.new(W) { Array.new( W, 0)}

old = get_time()
10.times { # 時間をはかるために無駄に回す
  n = 0
  update(a) {|c,x,y| n += c}
    # 400x400の配列を舐める
}
p get_time() - old

# => 5.828sec

ちょっとデカい配列を弄ろうとしたら,落ちたのか?ってほど遅くなった.


def update(as)
  W.times {|y| W.times{|x| yield( as[y][x], x,y) } }
end

# => 4.359sec

こっちのほうが軽いのか.上のだとrowを取り出す手間があるとか?
単に,each_with_index > timesなだけ?


1次元配列にしてみる

def update(as)
  c = 0
  W.times {|y| W.times{|x| yield( as[c], x,y); c+=1 } }
end

a = Array.new(W*W, 0)

#=> 4.515

遅くなるんだ…



Procをやめる+1次元配列

10.times {
  n = 0
  c = 0
  W.times {|y| W.times{|x| n += a[c]; c+=1 } }
}

#=> 1.891

さすがに早くなるよね.


2次元配列に戻してみる

  W.times {|y| W.times{|x| n += a[y][x] } }

#=> 1.625

おぉ.


意地悪く順番を変えてみる

  W.times {|y| W.times{|x| n += a[x][y] } }

#=> 1.657

お!?そんなに変わらない.


しかし,当初の目的からすると1周0.16secでも耐えられないほどの遅さ.