是否可以检查缓存的正则表达式的数量?

时间:2012-10-18 14:56:19

标签: c# .net regex

  

Regex.CacheSize属性   获取或设置已编译正则表达式的当前静态高速缓存中的最大条目数。

     

Regex类维护在>静态方法调用中使用的已编译正则表达式的内部缓存。如果在set操作中指定的值小于当前>高速缓存大小,则丢弃高速缓存条目,直到高速缓存大小等于指定的>值。

     

默认情况下,缓存包含15个已编译的静态正则表达式。您的应用程序>通常不必修改缓存的大小。如果要关闭缓存或者有异常大的缓存,请仅使用CacheSize属性>

所以我想深入了解缓存中当前的表达式数量。任何人都知道是否可以这样做?

我想重用<其中15个现在不想摆弄CacheSize,但是希望能够在某个时刻检查实际的缓存使用情况,如果我达到最大值(正如使用正则表达式扩展)或动态调整CacheSize

或者,关于将CacheSize简单地增加到某个任意大数的开销的任何评论?

1 个答案:

答案 0 :(得分:14)

反编译(mscorlib 4.0)显示缓存是internal的{​​{1}}链接列表,所以如果没有反射,你就不会得到它。

增加最大缓存大小的开销是:

  1. 存储缓存条目的内存成本;在CachedCodeEntry创建时,最大值的使用就像这样的逻辑:

    • 我们一般都在缓存吗?
      • 如果是,请缓存此正则表达式
      • 我们现在超过了最大缓存大小吗?
        • 如果是,请删除最后一个缓存条目

  2. 2.遍历缓存寻找匹配的成本增加

    只要你的数字不荒谬,你就可以开始了。

    以下是您需要检索当前缓存大小的反射代码:

    Regex

    我们使用强制转换为 public static int RegexCacheSize() { var fi = typeof(Regex).GetField("livecode", BindingFlags.Static | BindingFlags.NonPublic); var coll = (ICollection)(fi.GetValue(null)); return coll.Count; } 来避免必须转换为内部类型的通用列表的复杂性。