2010-03-05 109 views
1

當您使用正則表達式實例時,該方法在其中調用該方法幾千次來解析事件的方法中使用,如果該方法包含正則表達式實例,或者正則表達式實例是否爲類作爲靜態成員?在哪裏存儲正則表達式?

我感覺初始化相同的正則表達式數千次可能是開銷。但我主要關心的是最佳做法。

我應該在哪裏聲明和定義正則表達式?

編輯:僞代碼:

static Regex regex ... 

IEnumerable<string> Parse (string str) 
{ 
    var matches = // use regex 
    foreach (var match in matches) 
    { 
     ... 
    } 
} 

void Main() 
{ 
    foreach (var page in pages) 
    { 
     Parse (page); ... 
    } 
} 

回答

2

你的類包裝您的分析功能應包含一個私有引用(如果它是一個靜態的使用可能是靜態的),以正則表達式,如果你很在意那種東西。

編輯:

對我來說,這不是真正的性能,如因爲有內部緩存和所有的爵士樂吉米提到的,我想像一個正則表達式的創建可能是不那麼貴作爲實際的正則表達式處理。它更多的是關於設計原則:工廠方法或解析實用程序在概念上運行時使用一些內部過濾器(正則表達式)爲您生成一個列表。如果它是反覆使用的那個,那麼這個概念上就是你一次創建的東西,然後保持和反覆使用。

+0

是因爲創建新的Regex實例很昂貴。我似乎記得閱讀這樣的東西,但不知道。 – 2010-03-05 17:41:04

+1

@Joan:對我來說,更多的是關於設計原則。我會編輯我的答案。 – Tanzelax 2010-03-05 17:46:20

+0

如果你打算在不同的地方稱它爲幾次,那麼我認爲可能使它與靜態的RegexOptions.Compiled會有所幫助。也許有人知道多一點會給答案解釋RegexOptions.Compiled的好處? – 2011-02-28 11:20:06

2

如果你調用一個循環的正則表達式的幾千倍,靜態方法實現基於LRU緩存爲您服務。

我只是依靠它,除非你的方法在你的應用程序的整個生命週期中被偶爾調用了幾千次,其中你最好在你的類中放置一個靜態引用。這取決於你的特定用例。

看到:http://blogs.msdn.com/bclteam/archive/2006/10/19/regex-class-caching-changes-between-net-framework-1-1-and-net-framework-2-0-josh-free.aspx

+0

謝謝,我添加了一些示例代碼來展示它的外觀。 – 2010-03-05 17:32:12

+2

自動緩存很好,但我喜歡私有靜態的想法,以表明「這個正則表達式使用了很多,讓我們保持它」。 – 2010-03-05 17:35:37

1

我幾乎總是創建正則表達式作爲它將被使用的類的靜態成員,或者如果它在很多地方使用,則在常見的utils類中創建。

+0

是因爲創建新的正則表達式實例很昂貴。我似乎記得閱讀這樣的東西,但不知道。 – 2010-03-05 17:39:31

+1

一遍又一遍地創建任何對象可能會很昂貴。我不知道正則表達式是否比其他有用的對象相對更多或更少。但是,如果我要多次使用某些東西,我想保留它,隨時準備出發,以便儘快響應用戶請求。 – Ray 2010-03-05 17:52:42

相關問題