.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
- .NET Core 2.0 RSA PlatformNotSupportedException
- Razor类库中的图像
- 找不到Microsoft.AspNetCore.Antiforgery
- 在ASP.NET Core MVC API控制器上对AuthorizeAttribute进行unit testing
- 是否支持.NET Core中的Microsoft.AspNet.WebApi.Client?
- HttpClient中“服务器返回无效或无法识别的响应”的含义
- 在.NET Core中将视图返回为字符串
- 从.NET Core运行PowerShell
- .net Core X Forwarded Proto无法正常工作