【发布时间】:2011-10-11 18:26:40
【问题描述】:
我的程序中有一个 parse 方法,它首先从磁盘读取文件,然后解析行并为每一行创建一个对象。对于每个文件,之后都会保存包含行中对象的集合。文件大约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。
EDIT2:我正在使用 Visual Studio 2010 Professional。此版本中似乎没有用于性能分析的工具(根据 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 秒。我遇到了一些我必须跟踪的并发问题,但至少这比以前快得多。
感谢您的建议。
【问题讨论】:
标签: multithreading disk