代码之家  ›  专栏  ›  技术社区  ›  Pavel Tupitsyn

.NET Core 2.1-循环中的regex比2.0慢200倍(简单基准测试中是3倍)

  •  16
  • Pavel Tupitsyn  · 技术社区  · 6 年前

    我有以下正则表达式:

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

    它有超过1000根弦( IsMatch 呼叫)。在.NET Core2.0中 10ms . 在迁移到.NET Core2.1之后,它将接管 2 seconds 同样的数据。

    知道怎么回事吗?2.1中有任何行为变化吗?

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

    更新:benchmarkdotnet

    可重复3x滴(只需运行,更改 netcoreapp2.1 netcoreapp2.0 在里面 csproj 文件,再次运行)。 https://github.com/ptupitsyn/netcore2.1-regex-perf/tree/master/src

    • 尽可能地简化实际应用程序减少了下降,但是 仍然非常明显。
    • 翻转嵌套循环 GetPackageInfos2 将性能下降降低到 25% ,但它仍然存在。在实际的代码中更改这一点并不容易,我希望避免这种重构。
    • 在一个循环中执行了多个regex,我不能用一个regex重新生成drop

    更新2

    移除 RegexOptions.Compiled 解决问题!

    1 回复  |  直到 6 年前
        1
  •  7
  •   Pavel Tupitsyn    6 年前

    RegexOptions.Compiled 未实现 在.NET Core2.0中,但是 已实现 在.NET核心2.1中。

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

    我的例子有点复杂,而且看起来.net中可能有一个bug,因为即使有一个适当的基准(带预热)。 Compiled 模式比较慢。详见Corefx发行: https://github.com/dotnet/corefx/issues/30131