我在我的程序中有一個解析方法,它首先從磁盤讀取一個文件,然後解析這些行併爲每一行創建一個對象。對於每個文件,以後都會保存包含行中對象的集合。這些文件大約是300MB。 這需要大約2.5-3分鐘才能完成。加速多線程
我的問題:如果我將任務分配到一個線程,只是從磁盤讀取文件,另一個線程解析和第三個保存集合,我能期待顯着的加速嗎?或者這可能會減緩這個過程?
現代筆記本硬盤讀取300MB常見多長時間?我認爲,瓶頸是我的任務中的CPU,因爲如果我執行該方法,CPU的一個核心總是處於100%,而磁盤閒置超過半時間。
問候,雨
編輯:
private CANMessage parseLine(String line)
{
try
{
CANMessage canMsg = new CANMessage();
int offset = 0;
int offset_add = 0;
char[] delimiterChars = { ' ', '\t' };
string[] elements = line.Split(delimiterChars);
if (!isMessageLine(ref elements))
{
return canMsg = null;
}
offset = getPositionOfFirstWord(ref elements);
canMsg.TimeStamp = Double.Parse(elements[offset]);
offset += 3;
offset_add = getOffsetForShortId(ref elements, ref offset);
canMsg.ID = UInt16.Parse(elements[offset], System.Globalization.NumberStyles.HexNumber);
offset += 17; // for signs between identifier and data length number
canMsg.DataLength = Convert.ToInt16(elements[offset + offset_add]);
offset += 1;
parseDataBytes(ref elements, ref offset, ref offset_add, ref canMsg);
return canMsg;
}
catch (Exception exp)
{
MessageBox.Show(line);
MessageBox.Show(exp.Message + "\n\n" + exp.StackTrace);
return null;
}
}
}
所以這是解析法。它以這種方式工作,但也許你是對的,而且效率低下。我有.NET Framwork 4.0,我在Windows 7上。我有一個Core i7,每個核心都有HypterThreading,所以我只用了大約1/8的CPU。
編輯2:我正在使用Visual Studio 2010專業版。它看起來像用於性能分析的工具在該版本中不可用(根據msdn MSDN Beginners Guide to Performance Profiling)。
EDIT3:我現在更改了代碼以使用線程。它看起來像這樣:
foreach (string str in checkedListBoxImport.CheckedItems)
{
toImport.Add(str);
}
for(int i = 0; i < toImport.Count; i++)
{
String newString = new String(toImport.ElementAt(i).ToArray());
Thread t = new Thread(() => importOperation(newString));
t.Start();
}
雖然您在上面看到的解析在importOperation(...)中調用。
使用此代碼可以將時間從大約2.5分鐘縮短到「僅」40秒。我有一些併發問題需要跟蹤,但至少這比以前快得多。
謝謝您的建議。
如果這個任務是CPU綁定的話,我認爲有一定的空間用於改進代碼。 :) – bzlm