我在我的程序中有一个解析方法,它首先从磁盘读取一个文件,然后解析这些行并为每一行创建一个对象。对于每个文件,以后都会保存包含行中对象的集合。这些文件大约是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