我创建了一个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++;
}
对我来说奇怪的是,我知道每个循环都在几毫秒内运行,但从一个循环的开始到下一个循环的开始,时间不断增加。
如果这还不足以分析我的问题,我很抱歉,但我不确定如果不显示我的整个解决方案,我还能提供什么。
谢谢。
编辑:更好的问题可能是:如果秒表不能解决问题,分析性能的好方法是什么。我宁愿不必下载分析器。
答案 0 :(得分:0)
如果它花费的时间越来越长,在每次迭代时,它可能与初始cuttedWords.any()相关。
什么类型的cuttedWords?如果它是一个数据库支持的可枚举,它将在每次迭代时重新发出sql语句,这可能是你想要的也可能不是。
另一方面,如果这是生产者 - 消费者场景,则生产者可能会锁定cuttedWords,导致消费者在等待生产者完成其操作时被线程锁定。
此外,.reportProgress将导致后台工作者在创建它的线程上引发事件,可能导致UI更新,因此可能尝试删除该行并查看它是否有帮助。然后将其替换为仅在进度实际发生变化时调用reportProgress的代码。