3

私は D 言語を学んでおり、その機能の多くが気に入っていますが、GC については少し懐疑的です。チャンスを与えたいのですが、最初に知りたいのは:

  • どのくらいの頻度で実行されるかを見積もる方法は?
  • どのくらいの期間実行されますか? 割り当てられたメモリの量、管理対象オブジェクトの量などに比例しますか?

現在の D2 ランタイムの GC について具体的に質問しています。

場合によっては GC によってパフォーマンスが向上することはわかっていますが、次の例はどうでしょうか。ゲームの開始時に大量のメモリ (数百メガバイトの複雑な構造) を割り当てるゲーム エンジンを想像してみてください。ただし、ゲームの実行中は割り当てられません。ほぼすべての割り当て/割り当て解除。しかし、いくつかはまだ発生します (たとえば、GUI の文字列操作から) - それらの小さなことが最終的に GC をトリガーし、割り当てられたすべてのメモリをスキャンする必要がありますか? 私が理解しているように、ほとんどのデータのメモリを自分で管理することにしたとしても、マネージド メモリ (文字列など) への参照を保持できるようにする場合は、範囲を GC に登録する必要があります。

もちろん、最初にプログラムして後でプロファイリングすることもできますが、事前にパフォーマンスについて少なくともいくつかの見積もりを作成できるようにしたいと考えています。後でいくつかの回避策に頼るよりはましです。(フリーリストのような解決策は、私の意見では醜い回避策であり、どこでも使用できるわけではありません。)

4

2 に答える 2

3

正確な答えはありませんが、私が言えることは次のとおりです。

1) 最も確実なソースは gc のソース コードです: https://github.com/D-Programming-Language/druntime/blob/master/src/gc/gc.d (非常によく似た gcx .d ファイル

2) gc 割り当てを行うと、gc が実行されることが期待できます (まあ、新しいブロックを割り当てる必要があると判断した場合は、最初に既存のものを収集しようとしますが、実際には私の経験では、すべての new が gc コレクションになる可能性があると仮定します)、プログラムの終了時、およびそれ以外の場所ではありません-gc メモリを割り当てないと、gc は実際には何もしません。プログラムがランダムに実行されるのを止めることはありません。

ただし、どこを見ればよいかわからない場合は、ランダムに見えるかもしれません。このページの下部を確認してください: http://dlang.org/garbage.html

最も頻繁に私を悩ませるのは、配列リテラルです: auto x = [1,2,3]; 実行時の GC 割り当てです。すべてではありませんが、gc 割り当てを行う phobos 関数もかなりの数あります。phobos 関数が配列 (文字列を含む) を返す場合、割り当てられる可能性は高くなります。データを受信するためにバッファーを渡したことがわかっていない限り、戻り値は新しいブロックになる可能性があります。

そうは言っても、フォボの多くは実際には割り当てがなく、リリースごとに改善されています。私は、std.algorithm と std.digest パッケージのすべてが、今では特に割り当てられていないと信じています。したがって、すべてを捨てる必要はありません。避けるべき機能を知っているだけです。

プログラムを書いたことがあり、隠れた割り当てを見つけたい場合は、デバッガーを使用します。メイン ループの直前にブレークポイントを設定します。次に、gc_malloc と gc_qalloc にブレークポイントを設定して続行します。壊れた場合は、スタック トレースを取得すると、後で何を避けるべきかがわかります。

メイン ループが GC 割り当てフリーである場合、GC コレクションもフリーになります。

3) GC はすべてのメモリをスキャンしますか? 必ずしも。ブロックをスキップできる gc 実装 (ソースの mark 関数を参照) には noscan フラグがあります。druntime/src/rt/lifetime.d で、これ (ここでは BlkAttr.NO_SCAN と呼ばれます) が TypeInfo に基づいて設定されていることがわかります。これは正確ではありませんが、大きな配列の割り当てなどで正しく設定されていると確信しています。ゲームのバルク データ アセットはスキャンしないでください。

したがって、かかる時間は、実際にスキャンするメモリの量に比例し、割り当てた量よりもかなり少なくなる可能性があります。

于 2013-11-14T16:23:53.233 に答える
1

誰かがすでにそのような調査を行っており、それに関する記事を書いています: Real World Comparison, GC vs. Manual Memory Management - Benjamin Thaut .

ところで、より役立つ記事はhttp://wiki.dlang.org/Articlesにあります。

于 2013-11-14T16:14:13.497 に答える