2011-04-14 43 views
-1

有沒有簡單的方法來衡量Java應用程序內所有正則表達式的性能?衡量正則表達式性能

+1

你的問題不清楚。你能澄清你到底想要解決什麼問題嗎? – 2011-04-14 00:40:00

+2

對不起。這完全太模糊,不能成爲一個真正的問題。 「所有正則表達式」是什麼意思?你的意思是所有可能的正則表達式對所有可能的文本?在這種情況下,「衡量業績」是什麼意思?你需要重新思考你想要問什麼,並且要更清楚地陳述它,並且提供更多的信息。投票結束爲「不是真正的問題」。 – 2011-04-14 00:42:02

回答

2

是否有一種簡單的方法來測量應用程序中所有正則表達式的性能?

字面上不可能。有無數的可能的正則表達式。

是否有一種簡單的方法來衡量所有正則表達式的性能中使用的應用程序?

有沒有簡單的方法。但你可以嘗試以下方法:

  • 寫一個靜態的分析,以查明Pattern.compile(...)叫所有的地方,並提取含正則表達式的文本字符串:

    • 的正則表達式可以動態創建。

    • 實際性能取決於輸入字符串以及正則表達式。

  • 運行通用分析器並查看哪些對匹配器的調用花費了大量時間。

    • 您可以識別哪些是瓶頸的語句,但這不會告訴您輸入字符串或(在所有情況下)正則表達式。
  • 黑客模式和匹配器的相關方法來記錄時間信息和捕獲正則表達式和輸入。

    • 涉及修改系統類 - 壞主意。

    • 你可能會使用AOP或字節碼修改 - 更清潔,但更復雜。

  • 爲Pattern和Matcher創建自己的包裝來完成上述操作,並將它們用於標準類的代碼位置。

    • 很難找到/更改所有的事件;例如在第三方庫或類似String.split(...)的sysme類中。
2

大多數IDE的有一個分析選項,以顯示出哪些操作被稱爲多久和多少時間,他們走。如果您編寫應用程序以便所有正則表達式處理都在輔助方法內完成,您將看到該方法在配置文件中的執行方式。

1

如果您想比較給定各種輸入的正則表達式的性能,您需要測量執行與正則表達式匹配所需的CPU時間(與「用戶時間」相對)。

這是我會傾向於做的。爲每個正則表達式/輸入對寫一個JUnit測試。你可以使用JUnit斷言來驗證你的正則表達式是否符合你的意圖,什麼也不符合。然後,您可以爲測試用例添加額外的語句,以測量每個輸入 - 正則表達式對消耗的CPU時間。一些簡短的研究表明,測量Java中CPU時間的一種方法是使用ThreadMXBean(可通過調用ManagementFactory.getThreadMXBean()獲得實例)。該界面包括用於檢查CPU時間測量是否受支持以及獲取CPU時間的方法。您只需要在每次比賽之前和之後立即獲取CPU時間,並且當然的差異是比賽所需的CPU時間量。

希望這會有所幫助!也許有人知道更好的界面/庫來衡量CPU時間,因爲在單元測試中使用ThreadMXBean似乎很難。另請注意,單元測試產生輸出通常被認爲是不好的做法,因此您可能會考慮在完成調查正則表達式的性能後刪除任何打印語句。