我找不出什么在减慢我的程序的速度
我创建了一个Windows窗体应用程序,它读取文本文件,重新排列数据并写入新的文本文件。我注意到它在运行时呈指数级减速。我一直在使用跟踪点,秒表和日期时间来找出为什么每次迭代所花的时间比以前更长,但我无法弄清楚。我最好的猜测是,它可能与我初始化变量的方式有关。我找不出什么在减慢我的程序的速度
我不知道该代码片段多大的帮助将是,但也许它会给一些洞察我的问题:
while (cuttedWords.Any())
{
var variable = cuttedWords.TakeWhile(x => x != separator).ToArray();
cuttedWords = cuttedWords.Skip(variable.Length + 1);
sortDataObject.SortDataMethod(variable, b);
if (sortDataObject.virtualPara)
{
if (!virtualParaUsed)
{
listOfNames = sortDataObject.findListOfNames(backgroundWords, ref IDforCounting, countParametersTable);
}
virtualParaUsed = true;
printDataObject.WriteFileVirtual(fileName, ID, sortDataObject.listNames[0], sortDataObject.listNames[1],
sortDataObject.unit, listOfNames, sortDataObject.virtualNames);
sortDataObject.virtualNames.Clear();
}
else
{
int[] indexes = checkedListBox1.CheckedIndices.Cast<int>().ToArray();
printDataObject.WriteFile(fileName, ID, sortDataObject.listNames[0], sortDataObject.listNames[1],
sortDataObject.unit, sortDataObject.hexValue[0], sortDataObject.stringShift, sortDataObject.sign,
sortDataObject.SFBinary[0], sortDataObject.wordValue, sortDataObject.conversions, sortDataObject.stringData, indexes, sortDataObject.conType);
}
decimal sum = ((decimal)IDforCounting)/countParametersTable * 100;
int sum2 = (int)sum;
backgroundWorker1.ReportProgress(sum2);
ID++;
IDforCounting++;
b++;
}
有什么奇怪的是,我知道,每个循环中运行毫秒级的问题,但从一个循环开始到下一个循环开始,时间不断增加。
我很抱歉如果没有足够的信息来分析我的问题,但我不确定我可以提供什么,而不显示我的整个解决方案。
谢谢。
编辑:一个更好的问题可能是:如果秒表没有执行技巧,什么是分析性能的好方法。我宁愿不必下载分析器。
如果它在每次迭代中花费的时间越来越长,它可能与最初的cuttedWords.any()有关。
什么类型是cuttedWords?如果它是一个数据库支持的枚举,它将在每次迭代时重新发出sql语句,这可能是也可能不是你想要的。另一方面,如果这是一个生产者 - 消费者场景,可能是生产者锁定了cuttedWords,从而导致消费者在等待生产者完成其操作时被锁定线程。
此外,.reportProgress将导致backgroundworker在创建它的线程上引发事件,可能导致UI更新,因此可能尝试删除该行并查看它是否有帮助。然后用一些只调用reportProgress的代码替换它,如果进度实际发生了变化。
cuttedWords是IEnumberable类型
我不认为.reportProgess是问题,因为整个循环运行很快。这是迭代之间的问题。 – user2340818
你可以尝试在第一次迭代之前调用.ToList()吗? – Soraz
内存使用情况如何?如果内存使用量增加很快,那可能是原因。 – Matt
我很确定我已阅读过有关Skip的潜在性能问题。一种解决方案是使用“Batch”扩展方法(例如https://code.google.com/p/morelinq/source/browse/MoreLinq/Batch.cs?r=f85495b139a19bce7df2be98ad88754ba8932a28)。然而,这是纯粹的猜测,因为我无法明显地调试你的代码与你的数据集。 –
@Matt这是一个很好的问题。我会研究一下。我可以跟踪断点和/或跟踪点的内存使用情况吗? – user2340818