在分析使用已编译正则表达式的一些代码时,我注意到.NET RegexRunner发现了大量调用CurrentCulture的调用。事实上,它有两种不同的方式 - GetCurrentCultureNoAppX和get_CurrentCulture。
正如此剖析截图所示,它检查了32亿次,占总时间的25%: -
我尝试添加RegexOptions.CultureInvariant选项,将调用次数减少到480万左右,将5%调用更好: -
但我的问题是: -
为什么它会多次获得文化而不仅仅是开始执行扫描时的文化? (当然,没有用于处理扫描中期文化变化的用例)
根据评论中的要求,以防它有所帮助,这里是正则表达式 - 基本上只是将网页中的一些数据抓取到命名组中。
@"(?><td\s*class=""XXX"">\s*(?<X1>[^<]+?)\s*</td>)(?>\s*<td[^>]+>\s*(?<X2>[^<]+?)\s*</td>)(?>\s*<td[^>]+>\s*(?<X3>[^<]+?)\s*</td>)(?>\s*<td[^>]+>\s*(?>(?<X4>[^<]+?)\s*</td>))(?>\s*<td[^>]+>\s*(?<X5>[^<]+?)\s*</td>)?(?>\s*<td[^>]+>\s*(?<X7>[^<]+?)\s*</td>)(?>\s*<td[^>]+>\s*(?<X8>[^<]+?)\s*</td>)(?>\s*<td[^>]+>\s*(?<X9>[^<]+?)\s*</td>)(?>\s*<td[^>]+>\s*(?<X10>[^<]+?)\s*</td>)(?>\s*<td[^>]+>\s*(?<X11>[^<]+?)\s*</td>)\s*</tr>"
并且使用的选项是:
RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled | RegexOptions.CultureInvariant