Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex vb.net正则表达式通过编译和共享变量提高性能_Regex_Vb.net_Compilation_Static Variables - Fatal编程技术网

Regex vb.net正则表达式通过编译和共享变量提高性能

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

我正在编写一些使用固定正则表达式搜索字符串和模式匹配的代码

这很简单,但是我想通过编译一个高流量的网站来提高regex的性能

我正在考虑编译正则表达式并将其放入类中的共享静态变量中

大概是这样的:

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中跳出来,我喜欢这些新功能!!!!