11

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

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

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

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

想法是我现在重用 < 15 个,所以不想摆弄CacheSize,但希望能够在某个时候检查实际的缓存使用情况以记录是否达到最大值(随着正则表达式使用的扩展)或动态调整CacheSize

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

4

1 回答 1

15

反编译(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;
    }

我们使用强制转换ICollection来避免必须强制转换为内部类型的泛型列表的复杂性。

于 2012-10-18T15:11:00.450 回答