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

Kar*_*ger 11 .net c# regex

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

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

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

所以我想了解缓存中当前表达式的数量.有谁知道这是否可行?

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

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

Aak*_*shM 14

反编译(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;
    }
Run Code Online (Sandbox Code Playgroud)

我们使用强制转换ICollection来避免必须在内部类型上强制转换为通用列表.