[英]Very slow regex perfomance?
我的應用程序運行緩慢,有時需要幾個小時才能恢復正常。 當我使用探查器時,我發現代碼占用大量時間,而正則表達式匹配發生的地方不過是什么。 任何人都可以指導我如何提高性能。 該代碼段如下所示
Regex rx = new Regex(@"^[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\@[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\.[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*$|^$");
rx.IsMatch("john.gilbert.stu.seattle.washington.us");
有什么辦法可以緩存模式並重用它?
您可以通過編譯和緩存來稍微提高RegEx的速度,但是很難解決您所擁有規模的性能問題。 即,一些需要O(n ^ 2)的慢速RegEx不會由於緩存/編譯或任何其他類型的自動處理而神奇地變為O(n)。
您需要檢查正則表達式並驗證每個正則表達式的執行次數。 最快的代碼是根本不需要運行的代碼-因此,如果有多余的匹配項,請先消除浪費的匹配項。 您可能需要切換到更合適的文本解析方式(例如,對RegEx進行HTML解析很可能是錯誤的方式-像HtmlAgilityPack這樣的良好HTML解析器與目標查詢結合使用可能更合適)。
如果字符串解析起來並不那么復雜,我只是將它們轉換為字符數組,然后自己解析。 它將大大提高性能。 RegEx的性能非常差。
for (int i = 0; i < string.Length; i++)
{
if (string[i] has some defining quality)
if (string[i] meets second requirement)
// break, change flag, ect.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.