为什么编译正则表达式检查文化这么多次?

时间:2016-10-12 14:47:40

标签: .net regex performance culture

在分析使用已编译正则表达式的一些代码时,我注意到.NET RegexRunner发现了大量调用CurrentCulture的调用。事实上,它有两种不同的方式 - GetCurrentCultureNoAppX和get_CurrentCulture。

正如此剖析截图所示,它检查了32亿次,占总时间的25%: -

Original Profiling results

我尝试添加RegexOptions.CultureInvariant选项,将调用次数减少到480万左右,将5%调用更好: -

enter image description here

但我的问题是: -

为什么它会多次获得文化而不仅仅是开始执行扫描时的文化? (当然,没有用于处理扫描中期文化变化的用例)

根据评论中的要求,以防它有所帮助,这里是正则表达式 - 基本上只是将网页中的一些数据抓取到命名组中。

@"(?><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

0 个答案:

没有答案