7

Roslyn September 2012 CTP with Reflector を見ていると、SlidingTextWindow クラスに次のものが含まれていることに気付きました。

internal sealed class SlidingTextWindow : IDisposable
{
    private static readonly ConcurrentQueue<char[]> arrayPool = new ConcurrentQueue<char[]>();
    private int basis;
    private readonly LexerBaseCache cache;
    private char[] characterWindow;
    private int characterWindowCount;
    private int characterWindowStart;
    private int offset;
    private readonly IText text;
    private readonly int textEnd;

    public SlidingTextWindow(IText text, LexerBaseCache cache)
    {
        this.text = text;
        this.basis = 0;
        this.characterWindowStart = 0;
        this.offset = 0;
        this.textEnd = text.Length;
        this.cache = cache;
        if (!arrayPool.TryDequeue(out this.characterWindow))
        {
            this.characterWindow = new char[2048];
        }
    }

    public void Dispose()
    {
        arrayPool.Enqueue(this.characterWindow);
        this.characterWindow = null;
    }

    // ...
}

このクラスの目的は、 を使用して、入力テキストの部分文字列にすばやくアクセスできるようにすることだと思いchar[] characterWindowますcharacterWindow。これは、Eric Lippertが彼のブログで示しているように、文字列よりも文字配列の部分文字列を取得する方が高速であるためだと思います。

SlidingTextWindowクラスがインスタンス化されるたびに、クラスLexerがインスタンス化されます。これは、 への呼び出しごとに発生しSyntaxTree.ParseTextます。

arrayPoolフィールドの目的がわかりません。このクラスでの唯一の使用法は、コンストラクターと Dispose メソッドです。を呼び出すと、クラスと作成されたクラスSyntaxTree.ParseTextのインスタンスが 1 つしかないように見えます。インスタンスが破棄されたときに をキューに入れ、インスタンスが作成されたときに をデキューしようとすると、どのような利点がありますか?LexerSlidingTextWindowcharacterWindowcharacterWindow

おそらく、Roslyn チームの誰かがこれを理解するのを手伝ってくれるでしょうか?

4

1 に答える 1

17

利点は、収集圧力が低下することであり、全体的なパフォーマンスにプラスの効果があります。

もちろん、.NET ガベージ コレクタは汎用のガベージ コレクタです。コンパイラと IDE の割り当てとオブジェクトの有効期間のパターンは、平均的な基幹業務アプリケーションのパターンとはかなり異なり、異常な方法で GC に負荷をかける傾向があります。

Roslyn 全体を見渡すと、小さな配列がキャッシュされて後で再利用される場所が多くあります。GC がそれらを短命のゴミとして識別してすぐに再利用できるようにするのではありません。実証実験では、これによりパフォーマンスが大幅に向上することが示されています。

プロファイリングで、コレクションの圧力にゲートをかけられた測定可能なパフォーマンスの問題があることが示されない限り、独自のアプリケーションでこれを行うことはお勧めしません。大部分のアプリケーションでは、GC は非常によく調整されており、プーリング戦略の利点は、かなりのコストに見合うものではありません。

于 2013-08-25T14:42:36.940 に答える