none
使用Regex.Matches方法時,CPU使用率達到100%問題 RRS feed

  • 問題

  • 我有一個使用兩種不同CPU,執行Regex.Matches方法的問題,以下開始述敘。 這是我要讓兩種不同的CPU執行的程式碼:
    MatchCollection matchs =Regex.Matches(Source_str, @"<b>(\d\d-\d\d).*?(\d\d:\d\d).*?#.>(.*?)<.*?#.>(.*?)<.*?-(.*?)<", RegexOptions.Singleline);
    

    Source_str: 是一個從硬碟上的網頁內容。

    而網頁的內容裡面並沒有符合上面pattern參數列所符合的項目,所以我print出matchs.Count的數值為0 。

    相關建構環境如下:

    作業系統:Microsoft Windows XP Professional
    OS Service Pack:Service Pack 3
    CPU 類型:DualCore Intel Core 2 Duo E6750, 2676 MHz (8 x 335)
    而上面這段程式碼我是使用Microsoft Visual C# 2008 Express Edition建構出
    .Net Framework 2.0 的Release版的程式。

     

    接著我把程式轉移到另一個環境下

    作業系統:Microsoft Windows XP Home Edition
    OS Service Pack:Service Pack 3
    CPU 類型:Mobile Intel Pentium M 730, 1600 MHz (12 x 133)
    安裝套件:.Net Framework 2.0 與 3.5 都各別測試過

    執行從第一個環境來的程式時,相同的網頁原始碼,執行結果會造成CPU維持在100%。

     

    而我的問題在於,請問這個Regex.Matches方法,會因為什麼情況造成CPU維持100%這樣呢?

     

    當然我沒有只測試這兩台電腦,

    我各別都測試相同都是XP SP3版本,

    但唯一不同的是CPU種類不同,測試了四台,有兩台會100%,兩台正常。

    2010年7月25日 上午 09:00

解答

  • 給你幾個建議:

    1. 我隱約可以猜出來你想要檢索什麼類型的字串, 但是我不認為你所用的式子可以檢測出真正有意義的資訊出來。按照你現在的寫法, 你是真的想要從網頁的 HTML 文字中檢測出像 <b>07-25abc20:00abc#a>abc<abc#a>abc<abc-abc< 的一串字嗎? 當你要把 Regex 真正拿來用之前, 我建議你先到像 Regex Lib 這類網頁做過徹底的測試; 或者下載 Expresso 這類免費工具來用也是不錯的。
    2. Regular Expression 檢測當然會耗費 CPU; CPU 等級愈低, 效能一定也愈低。我建議你把文字丟過去檢測之前, 先把原始內容裁剪一下, 只檢測真正要受測的那一部份, 而不是把整份網頁通通丟過去; 像是 JavaScript 和 CSS 等文字應該可以先排除掉。
    3. 有時想要檢測的樣式可能會比較複雜, 這時就不要太堅持在一個 Regex 式子裡把所有檢測要件通通寫在裡面, 而是可以把它拆解。例如先拆成幾個 AABBCC 字串, 從得到的結果中再逐個檢測有沒有 AABB 樣式, 最後再去檢測有沒有 BB 樣式。


    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    • 已標示為解答 js155036 2010年7月25日 下午 01:02
    2010年7月25日 下午 12:26

所有回覆

  • 給你幾個建議:

    1. 我隱約可以猜出來你想要檢索什麼類型的字串, 但是我不認為你所用的式子可以檢測出真正有意義的資訊出來。按照你現在的寫法, 你是真的想要從網頁的 HTML 文字中檢測出像 <b>07-25abc20:00abc#a>abc<abc#a>abc<abc-abc< 的一串字嗎? 當你要把 Regex 真正拿來用之前, 我建議你先到像 Regex Lib 這類網頁做過徹底的測試; 或者下載 Expresso 這類免費工具來用也是不錯的。
    2. Regular Expression 檢測當然會耗費 CPU; CPU 等級愈低, 效能一定也愈低。我建議你把文字丟過去檢測之前, 先把原始內容裁剪一下, 只檢測真正要受測的那一部份, 而不是把整份網頁通通丟過去; 像是 JavaScript 和 CSS 等文字應該可以先排除掉。
    3. 有時想要檢測的樣式可能會比較複雜, 這時就不要太堅持在一個 Regex 式子裡把所有檢測要件通通寫在裡面, 而是可以把它拆解。例如先拆成幾個 AABBCC 字串, 從得到的結果中再逐個檢測有沒有 AABB 樣式, 最後再去檢測有沒有 BB 樣式。


    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    • 已標示為解答 js155036 2010年7月25日 下午 01:02
    2010年7月25日 下午 12:26
  • 謝謝Johnny大大給予建議,

    只是還有不解,單純執行這個程式,

    卻是雙核心等級以上的電腦,也會有這個情況。

     

    不過我會採用您的建議,越分越細的拆解。

    2010年7月25日 下午 01:02