是否可以检查缓存的正则表达式的数量?
Regex.CacheSize属性获取或设置已编译正则表达式的当前静态高速缓存中的最大条目数。
Regex类维护>静态方法调用中使用的已编译正则表达式的内部缓存。 如果set操作中指定的值小于当前>高速缓存大小,则会丢弃高速缓存条目,直到高速缓存大小等于指定的>值。
默认情况下,缓存包含15个编译的静态正则表达式。 您的应用程序>通常不必修改缓存的大小。 如果要关闭缓存或具有exception大的缓存,请仅使用CacheSize属性。
所以我想深入了解缓存中当前的表达式数量。 任何人都知道这是否可行?
想法是我现在重复使用其中的15个,所以不想使用CacheSize
,但是希望能够在某个时刻检查实际的缓存使用情况,如果我达到最大值则记录(因为正则表达式用法扩展) )或动态调整CacheSize
。
或者,任何关于简单地将CacheSize
增加到某个任意大数的开销的评论?
反编译( mscorlib
4.0)显示缓存是CachedCodeEntry
的internal
链接列表,所以如果没有reflection,你就不会得到它。
增加最大缓存大小的开销是:
-
存储缓存条目的内存成本; 在正则
Regex
创建时,最大值的使用就像这样的逻辑:- 我们一般都在缓存吗?
- 如果是这样,请缓存此正则表达式
- 我们现在超过了最大缓存大小吗?
- 如果是,请删除最后一个缓存条目
- 我们一般都在缓存吗?
2.遍历缓存寻找匹配的成本增加
只要你的数字不荒谬,你就应该好好开始吧。
这是您需要检索当前缓存大小的reflection代码:
public static int RegexCacheSize() { var fi = typeof(Regex).GetField("livecode", BindingFlags.Static | BindingFlags.NonPublic); var coll = (ICollection)(fi.GetValue(null)); return coll.Count; }
我们使用ICollection
转换为ICollection
来避免必须转换为内部类型的generics列表的复杂性。