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

我有以下正则表达式:

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

它运行超过1000个字符串( IsMatch调用)。 在.NET Core 2.0中大约需要10ms 。 迁移到.NET Core 2.1后,对同一数据的处理时间超过2 seconds

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

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

更新:BenchmarkDotNet

netcoreapp2.0 3x下降(只需运行,在csproj文件netcoreapp2.0 csproj更改为netcoreapp2.0 ,再次运行)。 https://github.com/ptupitsyn/netcore2.1-regex-perf/tree/master/src

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

更新2

删除RegexOptions.Compiled解决了这个问题!

RegexOptions.Compiled 在.NET Core 2.0 中实现 ,但在.NET Core 2.1中实现。

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

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