Regex vb.net正则表达式通过编译和共享变量提高性能
我正在编写一些使用固定正则表达式搜索字符串和模式匹配的代码 这很简单,但是我想通过编译一个高流量的网站来提高regex的性能 我正在考虑编译正则表达式并将其放入类中的共享静态变量中 大概是这样的:Regex vb.net正则表达式通过编译和共享变量提高性能,regex,vb.net,compilation,static-variables,Regex,Vb.net,Compilation,Static Variables,我正在编写一些使用固定正则表达式搜索字符串和模式匹配的代码 这很简单,但是我想通过编译一个高流量的网站来提高regex的性能 我正在考虑编译正则表达式并将其放入类中的共享静态变量中 大概是这样的: Namespace Regexs Public Class UrlNickname Private Shared rgx As Regex = New Regex("^\/\w{4,20}$", RegexOptions.IgnoreCase Or RegexOptions
Namespace Regexs
Public Class UrlNickname
Private Shared rgx As Regex = New Regex("^\/\w{4,20}$", RegexOptions.IgnoreCase Or RegexOptions.CultureInvariant Or RegexOptions.Compiled)
''' <summary>
''' Returns a Nickname string if pattern found in Url, otherwise returns Empty string.
''' </summary>
''' <param name="url">The Url string to search.</param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function ContainsNickname(url As String) As String
If rgx.IsMatch(url) Then
Return url.Substring(1, url.Length - 1)
End If
Return String.Empty
End Function
End Class
End Namespace
Dim url As String = HttpContext.Current.Request.RawUrl
Dim nickname As String = Regexs.UrlNickname.ContainsNickname(url)
If Not String.IsNullOrEmpty(nickname) Then
//nickname pattern match found:
//do something like RedirectToRoutePermanent
End If
基本上,我将regex存储在一个共享静态变量中,以便只编译一次
然后调用该函数以检查在404错误页面上是否找到用户名模式匹配
这是提高正则表达式性能的最佳方法吗
注意:我对上面404错误页面问题的解决方案不感兴趣,它只是一个简单的例子
进一步的改进可以使用一个共享的regex通用列表,如下所示:
Private Shared _rgxList As List(Of Regex)
Public Sub New()
//get list of regex expressions from database and populate:
_rgxList.Add(New Regex("blah", RegexOptions.Compiled))
_rgxList.Add(New Regex("blah2", RegexOptions.Compiled))
Public Shared Function IsMatch(str) as Boolean
With each reg in _rgxList
return reg.IsMatch(str)
将在Application.Start事件上调用New。看起来不错。此外,我将使共享变量为只读,以避免意外更改 然而,请注意,编译正则表达式在运行时将性能提高约30%,但它也有其缺点,特别是需要更多内存。这里可以找到一个很好的比较: 所以,这里没有一般的A比B好的答案。这完全取决于你的具体要求。您可能需要进行测量,以找出在特定情况下哪些性能更好
关于性能调优的一般建议:在改进性能之前,确保确实存在性能瓶颈。不管你的正则表达式需要0.01秒还是0.02秒,例如,如果在数据库中查找昵称需要2秒。使用.net Framework中的内置工具(例如)或外部工具(例如)找出瓶颈所在。关于只读的好主意。这只是一个简单的例子,我想更多的是使用一堆正则表达式来搜索字符串中的亵渎内容等。我可以运行测试,但我只是想知道这是否是第一个实例中的最佳方法?我为问题添加了进一步的高级示例。编译将在应用程序启动时进行,相同的正则表达式将在网站的整个生命周期中一次使用几个月,直到重新启动。编写恐怖代码的文章真是大开眼界。它说,编译后内存不会被释放——如果网站不进行回收,这也没关系。但是,如果网站重新开放,会发生什么呢?正则表达式是否再次编译为内存-这会导致内存泄漏吗?@user961333:文章还说问题已在Whidbey中解决,Whidbey是Visual Studio 2005的代号,因此此问题不会影响您。谢谢,我使用的是VS2010和.net4。我直接从net1.1和VS2003中跳出来,我喜欢这些新功能!!!!