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