gpt4 book ai didi

c# - 为什么 C# RegexOptions.Compiled 会使匹配变慢?

转载 作者:太空狗 更新时间:2023-10-29 22:57:15 27 4
gpt4 key购买 nike

我有以下代码:

static void Main(string[] args)
{
const string RegXPattern = @"/api/(?<controller>\w+)/(?<action>\w+)/?$";
var regex = new Regex(RegXPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);

const string InputToMatch = "/api/person/load";

regex.IsMatch(InputToMatch); // Warmup

var sw = Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
{
var match = regex.IsMatch(InputToMatch);
}
sw.Stop();

Console.WriteLine(sw.Elapsed.ToString());
Console.ReadLine();
}

Releae 下在我的机器上运行上面的代码,在大约 18 秒内完成并删除 RegexOptions.Compiled 使其在 中运行>13 秒。

我的理解是,包含此标志会使匹配速度更快,但在我的示例中,它会导致 ~30% 性能降低。

我在这里错过了什么?

最佳答案

问题是编译后的 Regex 版本会逐个字符地与表单的当前区域性进行比较

if .... char.ToLower(runtext[index2], CultureInfo.CurrentCulture) == 'c' ....

为每个角色检索线程静态 CultureInfo.CurrentCulture。

这在分析器中显示为 CPU 消费者:

enter image description here

我有filed an issue for .NET Corefixed it with a PR .如果您需要将其合并回常规 .NET Framework,您应该在 github 上提交问题以请求向后移植。该问题出现在所有已设置的已编译正则表达式中

  • RegexOptions.IgnoreCase | RegexOptions.Compiled
  • RegexOptions.CultureInvariant | RegexOptions.Compiled
  • RegexOptions.CultureInvariant | RegexOptions.IgnoreCaseRegexOptions.Compiled

看似奇怪的选项RegexOptions.CultureInvariant | RegexOptions.Compiled 实际上是必要的,如果您在具有特殊大小写或数字分隔符的特定语言环境的线程上创建正则表达式。 Regex 匹配表达式将根据您当前的语言环境专门创建。如果你想要一个独立于语言环境的正则表达式,那么你需要使用 RegexOptions.CultureInvariant。

关于c# - 为什么 C# RegexOptions.Compiled 会使匹配变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40953573/

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