11

Regex.CacheSize プロパティ コンパイルされた正規表現の現在の静的キャッシュ内のエントリの最大数を取得または設定します。

Regex クラスは、静的メソッド呼び出しで使用されるコンパイル済み正規表現の内部キャッシュを維持します。set 操作で指定された値が現在の >cache サイズより小さい場合、キャッシュ エントリはキャッシュ サイズが指定された >value と等しくなるまで破棄されます。

デフォルトでは、キャッシュは 15 個のコンパイル済み静的正規表現を保持します。通常、アプリケーションはキャッシュのサイズを変更する必要はありません。CacheSize プロパティは、キャッシュをオフにする場合、またはキャッシュが異常に大きい場合にのみ使用してください。

そのため、キャッシュ内の現在の式の数を把握したいと思います。それが可能かどうか/どのように可能か知っている人はいますか?

現在、それらのうちの 15 個未満を再利用するという考えなので、をいじりたくないのですがCacheSize、ある時点で実際のキャッシュ使用量をチェックして、最大値に達した場合にログに記録できるようにしたいと考えています (正規表現の使用量が拡大するにつれて)。または動的に調整しCacheSizeます。

CacheSizeあるいは、任意の大きな数に単純に増やすことのオーバーヘッドに関するコメントはありますか?

4

1 に答える 1

15

逆コンパイル ( mscorlib4.0 の) により、キャッシュが のinternalリンクされたリストであることが明らかCachedCodeEntryになるため、リフレクションなしでは取得できません。

最大キャッシュ サイズを増やすことによるオーバーヘッドは次のようになります。

  1. キャッシュされたエントリを格納するためのメモリ コスト。最大値の使用法は、Regex作成時に次のような単純なロジックです。

    • 一般的に、私たちはキャッシュしていますか?
      • もしそうなら、この正規表現をキャッシュする
      • 最大キャッシュサイズを超えましたか?
        • その場合は、最後のキャッシュ エントリを削除します


2. 一致を探すためにキャッシュをトラバースするためのコストの増加

あなたの数字がばかげていない限り、あなたはそれを上げても大丈夫なはずです.

現在のキャッシュ サイズを取得するために必要なリフレクション コードは次のとおりです。

    public static int RegexCacheSize()
    {
        var fi = typeof(Regex).GetField("livecode", BindingFlags.Static 
                                                  | BindingFlags.NonPublic);
        var coll = (ICollection)(fi.GetValue(null));

        return coll.Count;
    }

ICollection内部型のジェネリック リストにキャストしなければならないという複雑さを避けるために、キャストを使用します。

于 2012-10-18T15:11:00.450 に答える