Rubyのガベージコレクタはオブジェクトの量だけでなくサイズも考慮していますか? Class
最適化のために、インスタンスをStruct
s またはプレーンHash
esに置き換えることを検討しています。どのクラスがガベージ コレクションに最大の影響を与えるかを理解したいと思います。
1 に答える
ベンチマークを行うべきだと言った人は正しいです。GC は複雑な問題であり、100% 正しい答えを出すことは困難です。
また、使用されている実装によって異なります。JRuby では、作業を行うのは JVM です。MRI では、マーク アンド スイープ GC です。
MRI の場合、多かれ少なかれ次のように動作します。Ruby インタープリターがより多くのメモリを必要とするたびに、GC を実行してメモリを解放しようとします。十分なメモリがない場合は、さらに割り当てます。そして、GC は、オブジェクトへの参照がない場合、オブジェクトを解放 (「マーク」) しても問題ないと判断します。
私からできる唯一のアドバイスは、ガベージ コレクションができないオブジェクトをたくさん使用しないようにすることです。たとえば、文字列の配列を作成している場合 (サイズは重要ではありません)、小さな文字列をそれぞれ連結して大きな文字列を作成した場合よりも、パフォーマンスの低下がはるかに速くなります。
これは、後者の場合、使用後に小さな文字列が GC によって破棄される可能性があるためです。一方、前者の場合、配列は常にそれぞれの文字列への参照を保持しています。
編集:もちろん、これは、メモリ内にそれらを維持するコストが「大きな文字列」を処理する速度低下よりも大きいことを前提としています。場合によっては、小さな文字列を作成してからそれらをすべて連結したほうがよい場合があります。その結果、1 回の操作が遅くなります。繰り返しますが、これらはベンチマークのない単なる例です。あまり真剣に受け止めないでください。