トップ «前の日記(2010-03-08) 最新 次の日記(2010-03-10)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2010-03-09

_ まともに動くようにするとバグが発現する。

ちょっとおもしろかったのでメモ。

なんらかの方法で作ったコレクションの各要素に対して処理を実行するのだが、うまくいかない要素もある。そういう要素を別のコレクションに入れておいて、後から別の方法で処理する。この処理は最初の処理と違って処理のためのリソースの取得に無闇と時間がかかる。しかもリソースが利用できるものかどうかは、実際に処理してみないとわからない。その判断にもえらく時間がかかる。そこで、1つ前の要素と同じリソースが利用できるときにはそれを利用するようにしてちょっとした高速化を考える。しかし遅い。

2nd_collection = []
org_collection.each do |e|
  unless proc(e)
    2nd_collection << e
  end
end
prior_resource = nil
prior_elem = nil
2nd_collection.each do |e|
  if e.same_type(prior_elem)
    unless proc2(e, prior_resource)
      error_proc(e)
    end
  else
    prior_elem = e
    resource = search_resource(e)
    next unless resource
    unless proc2(e, resource)
      error_proc(e)
    else
      prior_resource = resource
    end
  end
end

あ、Rubyで書いたらすぐバグがわかる(そこまでひどくないのでちょっと直した)。が、それは良いとして、遅いのは当然で、最初の処理用の並び順は、次の処理の並び順にとってはでたらめも良いところだからだ。

そこで次のように直した。

2nd_collection.sort do |x, y|
  # for 2nd loop
end.each do |e|

すると猛烈な速度で終わるようになった。しかし、処理結果はえらくでたらめなものとなりましたとさ。

というバグの発現の仕方がおもしろかったのだった。

本日のツッコミ(全3件) [ツッコミを入れる]
_ なかだ (2010-03-10 17:57)

「必要なリソースの種類」というものが取り出せるのであれば、先に分類するほうがわかりやすいのでは。<br><br>2nd_collection.group_by {|e|e.resource_type}.each do |type, elems|<br> if resource = search_resource(e)<br> elems.each do |e|<br> proc2(e, prior_resource) or error_proc(e)<br> end<br> end<br>end

_ なかだ (2010-03-10 17:57)

あ、コピペミス

_ arton (2010-03-10 22:13)

なるほど、group_byってこういう用途には便利ですね。<br>ふーむ。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|

ジェズイットを見習え