【发布时间】:2014-06-06 13:47:10
【问题描述】:
我创建了一个 Windows 窗体应用程序,它读取文本文件、重新排列数据并写入新的文本文件。我注意到它在运行时呈指数级减慢。我一直在使用跟踪点、秒表和日期时间来找出为什么每次迭代都比前一次花费更长的时间,但我无法弄清楚。我最好的猜测是这可能与我初始化变量的方式有关。
我不确定这段 sn-p 代码会有多大帮助,但也许它会对我的问题有所了解:
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++;
}
让我感到奇怪的是,我知道每个循环都在几毫秒内运行,但是从一个循环的开始到下一个循环的开始,时间不断增加。
如果这些信息不足以分析我的问题,我深表歉意,但如果不展示我的整个解决方案,我不确定我还能提供什么。
谢谢。
编辑:更好的问题可能是:如果秒表不起作用,什么是分析性能的好方法。我宁愿不必下载分析器。
【问题讨论】:
-
内存使用情况如何?如果内存使用量迅速增加,这可能就是原因。
-
我很确定我之前已经阅读过
Skip的潜在性能问题。一种解决方案是改用Batch扩展方法(例如code.google.com/p/morelinq/source/browse/MoreLinq/…)。但是,这纯粹是猜测,因为我显然无法根据您的数据集调试您的代码。 -
@Matt 这是个好问题。我会调查的。我可以使用断点和/或跟踪点跟踪内存使用情况吗?
-
@user2340818 你可以使用系统内部工具包中的进程监视器
-
什么版本的VS 2012?您可以直接进入分析 -> VIsual Studio 中的性能向导
标签: c# performance visual-studio-2010 stopwatch