速度を測る
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でも耐えられないほどの遅さ.