2004-03-01 [長年日記]
λ. objectpool-0.1.0
とあるコードで、オブジェクトを再利用してGCを減らすために、むとうさんのObjectPoolを使ってみて、
- ObjectPool#releaseが(オブジェクトの比較を「==」で行う)Array#indexを使っているので、等しいオブジェクトがあるとまずいことになりそう
- ObjectPool#get_object_from_objectpoolの途中でTimeoutErrorに割り込まれるとまずいことになりそう
- ObjectPool#releaseが一時的な配列オブジェクトを作るので、GCがあまり減らなそう
- ObjectPool#releaseとObjectPool#get_object_from_objectpoolで、配列を線形探索してる
という点が気になったので書き換えてみた(objectpool.rb)。TimeoutErrorに割り込ませないために、Thread.exclusive{ ... } を使ってみたんだが、関係ないスレッドも止めちゃうのはちょっとやりすぎだな。(つーか、ちゃんとConditionVariableでも使え > オレ)
[追記] というわけで、ConditionVariableを使うようにしてみた(objectpool-2.rb)。timeoutするConditionVariable#waitが無いので、timeout{ ... } 内でConditionVariable#waitしてみたのだけど、これって正しい使い方?
なるほど、勉強になります。
そのままメンテナンスも引き継ぎません?