2012-07-18 50 views
0

我有像下面顯示的代碼whcih正在做正則表達式比較,我想優化代碼。當我檢查.net分析器它顯示80%的時間在這裏花費,我檢查了我的正則表達式過濾器是否發生回溯,但沒有錯在正則表達式side.So這是現有的代碼正則表達式的性能問題?

public class TestFilter : SmoothFilter 
    { 
    public override bool Apply(Team liveEvent) 
      { 
        // Apply each individual piece of the filter using the Match method 
        if ((Filter == null) || (Filter.Length <= 0) || Match(Filter, pl.Instance)) 
        { 

      } 

    private bool Match(string pattern, string inputdata) 
    { 
     bool vals = Regex.IsMatch(inputdata, pattern, RegexOptions.IgnoreCase); 
     return vals; 
    } 
} 

當我用Google搜索我看到的鏈接http://blog.kurtschindler.net/post/regular-expression-performance-comparisons,提到最好且快速的方法,如果你不採取初始啓動時間。所以我修改了我的代碼,如下所示。但我移動了我的系統,我沒有任何工具來配置文件,任何機構可以告訴我它是否真的改善?這個修改後的代碼如下

static readonly Regex regexForMethod_E = new Regex("pattern", RegexOptions.Compiled); 

private bool Match(string pattern, string inputdata) 
{ 
    bool vals = regexForMethod_E.IsMatch("inputdata"); 
    return vals; 
} 

編輯

我還是我不知道如何將正則表達式實例內match()方法

+0

你可以寫自己的簡單的速度測試 - 例如:http://guyellisrocks.com/coding/speed-improvements-with-compiled-regex/比較性能 – dash 2012-07-18 07:29:44

+1

你的問題可以取決於你的正則表達式模式。請添加更多關於你的模式的細節。 – Ria 2012-07-18 08:23:26

+2

在這種情況下,爲什麼要使用正則表達式,如果你只是做一個簡單的比較平等? – 2012-07-18 09:10:42

回答

0

簡短的回答:我想是的,是的,但我不」知道多少。

長(呃)答案:我認爲你在節省自己和計算很多時間:看看你的方法在第一個實例中需要做多少即時計算。現在看看第二種方法需要做多少 - 你的函數只需要傳遞一個參數,而不是3;這是一個性能增益(儘管很小)。

正則表達式已經被計算出來了,所以程序需要做的就是根據輸入數據檢查它,而不是採取所有參數並在運行中計算它們。

更快的方法是這樣的:

private bool Match(string inputdata) 
{ 
    return regexForMethod_E.IsMatch("inputdata"); 
} 

我知道的變化幾乎可以忽略,但是想象一下,這個呼叫正在取得1000倍。這就是你實際上並不需要的1000個布爾變量!

+0

你真的說只有一個參數的方法將比3與一個更好?並且爲返回值創建變量會使性能得到改善? – Jamiec 2012-07-18 07:32:57

+0

@nathanwhite okey,但我無法理解你提到的有關函數中的參數,我的意思是如果我的新代碼錯誤或效率不高,你會修改併發布它嗎? – vettori 2012-07-18 07:33:21

+0

@Jamiec我想提一提我說「我認爲」和「我相信」。我會這樣認爲,但請,如果你能證明我錯了,我很樂意學習:) – 2012-07-18 07:35:06

1

這取決於模式的複雜性。在任何情況下,它都不會變得更慢,它會加快正則表達式的複雜性。

此外,您的代碼是不相同的。要做到這一點,你需要調用:

new Regex("pattern", RegexOptions.Compiled | RegexOptions.IgnoreCase); 
+0

我沒有得到你可以修改我的舊代碼與您的意見,我已修改我的問題 – vettori 2012-07-18 09:14:55

+0

我仍然不知道如何在Match()方法內移動正則表達式實例 – vettori 2012-07-19 02:00:51

+0

如果您只想實例化一次,請將其保留爲類成員。如果多次使用相同的模式,那這就是最好的表現方式。 – 2012-07-19 06:02:48