2009-08-19 6 views
0

Ruby環境でアクティブなオブジェクトの数に信頼できる値を取得するメカニズムはありますか?私は答えを生成するためにいくつかのアプローチを見つけた、と一般的に彼らは似ている:効率的で信頼性の高いアクティブオブジェクト数

c = 0 
ObjectSpace.each_object { c += 1 } 

これで不幸な問題は、単純に集計するために作成Fixnumかのオブジェクトの数が多いのいくつかの明白なオーバーヘッドはもちろんのこと、があることですObjectSpaceメソッド自体。もちろん

1は、クラスに応じて結果をフィルタリングし、単にFixnumかのオブジェクトを無視し、それがどのようにeach_object作品についての仮定を作るよう、それは不完全な回避策であると思われる可能性があります。

私は動作中に一点との間に生成され、ガベージコレクタのような別の正確な基準を提供するために、診断目的のためにオフにすることができるどのくらいのごみを決定するためのメカニズムを発見したいです。

+1

ませんFixnumかのオブジェクトがここで作成されている - Fixnumsが全く作成されていない、と彼らは本当にありません基本となる実装のオブジェクト彼らはintとしてリテラル表現をしています。 '42.object_id'と打ってみてください。常に同じ値になっています。これは、通常のオブジェクトの 'object_id'が常に偶数である理由です。奇数がFixnumに使われます。 – Chuck

+0

私はこのような印象を受けていましたが、そうではないようです。 0,1,2などのようないくつかの "fixed" Fixnumがあるようですが、特定のポイントを超えて実際に要求に応じて割り当てられます。 + =を使用すると、タイプに関係なく新しいオブジェクトが生成されます。 – tadman

+1

いいえ、すべてのFixnumに当てはまります。すべての整数がフィックスナムであるわけではありません。ある時点の後、彼らはBignumsになり、実際には必要に応じて割り当てられます。また、Fixnumで+ =を使用すると、新しいFixnumを作成することができないため、新しいオブジェクトを生成することはできません。試してみましょう: 'a = 5; b = 4; a + = 1; b + = 2; a.object_id == b.object_id'。私が言ったように、それは 'object_id'を通してリテラル表現を持っているので、すべての数字に対して1つのFixnumがあります。 – Chuck

答えて

2

私は、カーネルやGCで直接それを行うための方法が表示されません。 Railsはベンチマーク時にこれを実行しようとします。source code for active_support/testing/performance.rbを参照してください。残念ながら、これらのメソッドはすべて、Rubyインタプリタのパッチが必要です。

RubyProfドキュメントも便利です。これは、Railsが使用しようとする方法の1つです。あなたがパッチ(それを見つけることを確認していない)を適用する場合は、単に行うことができる必要があります:

RubyProf.measure_allocations; RubyProf::ALLOCATIONS

関連する問題