2014-10-07 106 views
-1

我正在使用一個應用程序,它接收來自遊戲服務器的包含日誌的udp數據包,並使用它們收集有關服務器正在發生的事情的信息 - 它通過正則表達式匹配來完成此操作。然而,我遇到了一個問題,如果程序一次接收足夠的數據包,CPU使用率會稍微平靜一些 - 在查看線程轉儲之後,這似乎是由於正則表達式匹配。優化Java正則表達式匹配

這裏是兩個模式的示例:

Pattern pattern = Pattern.compile(".*World triggered \"Game_Over\" reason \"(.+)\""); 
Pattern chatPattern = Pattern.compile("\"(.+)<([0-9]+)><\\[(U:[0-9]:[0-9]+)\\]><(Blue|Red)>\" say \"(.+)\""); 

然後它基於所述模式和它給出的日誌行創建匹配器並檢查匹配。它每次接收數據包時都會爲5種不同模式執行此操作 - 我如何優化這個以降低CPU使用率?

+0

爲了避免回溯,在所有'+'之後加一個'+'。 – 2014-10-07 10:53:58

+0

@AvinashRaj - 請解釋。如何/爲什麼避免回溯? – 2014-10-07 11:06:01

+0

http://www.regular-expressions.info/catastrophic.html – 2014-10-07 11:14:19

回答

1

我該如何優化這個以降低CPU使用率?

  1. 確保你不要反覆「編譯」相同的模式;即編譯一次,然後緩存它。

  2. 重構模式,以便如果存在常見(元)模式,可以避免重複匹配。

  3. 重構以便使用String.indexOf()可以完成初始匹配。例如,在第一個中,您可以使用indexOf來搜索「世界觸發」。然後使用從最初匹配偏移量開始的正則表達式來確認匹配。

  4. 根本不要使用正則表達式。硬編碼搜索。


但你走之前這條路,你應該輪廓應用程序,以確認你的信念,你有性能問題,並且該模式匹配真的一個顯著的性能瓶頸。