.NET Core 2.1 - 循环中的正则表达式200x比2.0慢(简单基准中为3x)

Pav*_*syn 17 c# regex .net-core

我有以下正则表达式:

    var regex = new Regex(
        @"^ActiveMQ[\d\.-]*$",
        RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
Run Code Online (Sandbox Code Playgroud)

它运行超过1000个字符串(IsMatch调用).在.NET Core 2.0中它需要10ms.迁移到.NET Core 2.1后,它将接管2 seconds相同的数据.

知道发生了什么事吗?2.1中的任何行为都有变化?

======================

更新:BenchmarkDotNet

可重复3次降(只运行,改netcoreapp2.1netcoreapp2.0csproj文件中,再次运行). https://github.com/ptupitsyn/netcore2.1-regex-perf/tree/master/src

  • 尽可能简化实际应用程序可以减少掉落,但仍然非常明显.
  • 翻转嵌套循环会将GetPackageInfos2perf降低仅降低25%,但它仍然存在.在真实世界的代码中更改它并非易事,我想避免这种重构.
  • 在循环中执行了多个RegEx,并且我无法仅使用一个RegEx重现丢弃

更新2

删除RegexOptions.Compiled解决了问题!

Pav*_*syn 7

RegexOptions.Compiled没有实现在.NET 2.0的核心,而实现在.NET 2.1的核心.

编译涉及初始开销,对于某些使用模式,此开销超过编译正则表达式的收益.

我的情况有些复杂,似乎.NET中可能存在错误,因为即使使用适当的基准测试(预热),Compiled模式也会变慢.详见Corefx问题:https://github.com/dotnet/corefx/issues/30131