我有以下正则表达式:
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%
,但它仍然存在。在真实世界的代码中更改它并非易事,我想避免这种重构。更新2
删除RegexOptions.Compiled
可以解决问题!
答案 0 :(得分:6)
RegexOptions.Compiled
在.NET Core 2.0中未实现,但在.NET Core 2.1中已实现。
编译涉及初始开销,对于某些使用模式,此开销超过了已编译正则表达式的收益。
我的情况有些复杂,似乎.NET中可能存在错误,因为即使使用适当的基准测试(带有预热),Compiled
模式也会较慢。请参阅Corefx问题中的详细信息:https://github.com/dotnet/corefx/issues/30131