我的應用程序正在解析不斷傳入的跟蹤。
我在外部庫中預編譯正則表達式。 讀取和分析輸入數據是在以下函數中完成的,該函數在工作線程中運行。
爲了演示目的,我已經精簡了代碼。目前它使用30個不同的正則表達式,它們被順序檢查。解析跟蹤數據的最佳做法
private void Filter()
{
Regex rgx_1 = new RegEx_1();
Regex rgx_2 = new RegEx_2();
...
Regex rgx_N = new RegEx_N();
uint index = 0;
while (!FilterThread.CancellationPending)
{
BufferLength = (int)Source.GetItemCount() - 1;
if (index <= BufferLength)
{
item = (ColorItem)Source.GetItem(index);
if (item != null)
{
tracecontend = item.GetItemSummary();
if (rgx_1.IsMatch(tracecontend))
{
current_trace = new TraceLine(index, tracecontend, GROUP_1);
}
else if (rgx_2.IsMatch(tracecontend))
{
current_trace = new TraceLine(index, tracecontend, GROUP_2);
}
else if (rgx_3.IsMatch(tracecontend))
{
current_trace = new TraceLine(index, tracecontend, GROUP_3);
}
...
else if (rgx_N.IsMatch(tracecontend))
{
current_trace = new TraceLine(index, tracecontend, GROUP_N);
}
listBox.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new AddTraceDelegate(AddTrace), current_trace);
}
index++;
System.Threading.Thread.Sleep(1);
}
}
}
通過這種方法,我可以每秒處理多達500條曲線,這對於實時跟蹤而言是足夠的。但是讀取包含高達2.000.000個痕跡的文件仍然需要相當長的時間。
你有什麼想法如何加快執行和提高吞吐量?
有沒有人有這種情況下的最佳做法?
編輯: 這裏是一個正則表達式
compilationList.Add(new RegexCompilationInfo(@"SomeTextToFilterFor(.*?)",
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant,
"RegEx_1",
"Utilities.RegularExpressions",
true));
RegexCompilationInfo[] compilationArray = new RegexCompilationInfo[compilationList.Count];
AssemblyName assemName = new AssemblyName("RegexLib, Version=1.0.0.1001, Culture=neutral, PublicKeyToken=null");
compilationList.CopyTo(compilationArray);
Regex.CompileToAssembly(compilationArray, assemName);
這看起來像[*優化性能與多個調用Regex.IsMatch在大型文本*](http://stackoverflow.com/questions/31432630/optimize-performance-with-multiple-calls-to-正則表達式-ismatch-上大文/ 31432829#31432829)。重點是:1)你使用有效的正則表達式嗎? 2)你用'RegexOptions.Compiled'聲明它們是私有靜態只讀字段嗎? (我猜不是通過查看問題)。 –
'tracecontend'的平均長度是多少? –
我相信你有'。*'和'。*?'的正則表達式。審查他們的效率。如果使用正則表達式解析HTML,請重新考慮該方法。 –