Можно ли проверить количество кэшированных регулярных выражений?

Свойство Regex.CacheSize Получает или задает максимальное количество записей в текущем статическом кеше скомпилированных регулярных выражений.

Класс Regex поддерживает внутренний кеш скомпилированных регулярных выражений, используемых в вызовах > статических методов. Если значение, указанное в заданной операции, меньше текущего > размера кэша, записи кэша отбрасываются до тех пор, пока размер кеша не будет равен указанному значению > .

По умолчанию кеш содержит 15 скомпилированных статических регулярных выражений. Вашему приложению > обычно не нужно изменять размер кеша. Используйте свойство CacheSize только > , когда вы хотите отключить кеширование или когда у вас необычно большой кеш.

Итак, я хотел бы получить представление о текущем количестве выражений в кеше. Кто-нибудь знает, возможно ли/как это возможно?

Идея заключается в том, что я повторно использую < 15 из них теперь не хотят возиться с CacheSize, но хотели бы иметь возможность проверять фактическое использование кеша в какой-то момент на любой из журналов, если я нажимаю max (при расширении использования регулярных выражений) или динамически настраивается CacheSize.

В качестве альтернативы, любые комментарии относительно накладных расходов просто увеличивают значение CacheSize до некоторого сколь угодно большого числа?

Ответ 1

Декомпиляция (из mscorlib 4.0) показывает, что кеш является internal связанным списком CachedCodeEntry, поэтому вы не сможете получить его без отражения.

Накладные расходы на увеличение максимального размера кеша будут следующими:

  • стоимость памяти для хранения кэшированных записей; использование максимума просто в логике, как это на 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, чтобы избежать осложнения приведения в общий список во внутреннем типе.