gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:42:35 27 4
gpt4 key购买 nike

Regex.CacheSize PropertyGets or sets the maximum number of entries in the current static cache of compiled regular expressions.

The Regex class maintains an internal cache of compiled regular expressions used in >static method calls. If the value specified in a set operation is less than the current >cache size, cache entries are discarded until the cache size is equal to the specified >value.

By default, the cache holds 15 compiled static regular expressions. Your application >typically will not have to modify the size of the cache. Use the CacheSize property only >when you want to turn off caching or when you have an unusually large cache.

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

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

或者,对于将 CacheSize 简单地增加到某个任意大的数字的开销有什么意见吗?

最佳答案

反编译(mscorlib 4.0)显示缓存是 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 来避免必须转换为内部类型的泛型列表的复杂性。

关于c# - 是否可以检查缓存的正则表达式的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12957612/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com