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

时间:2018-06-04 10:34:09

标签: c# regex .net-core

我有以下正则表达式:

    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

可重复3次丢弃(只需在netcoreapp2.1文件中运行,将netcoreapp2.0更改为csproj,然后再次运行)。 https://github.com/ptupitsyn/netcore2.1-regex-perf/tree/master/src

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

更新2

删除RegexOptions.Compiled可以解决问题!

1 个答案:

答案 0 :(得分:6)

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

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

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