我无法弄清楚什么会减慢我的程序速度

时间:2014-06-06 13:47:10

标签: c# performance visual-studio-2010 stopwatch

我创建了一个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++;
        }

对我来说奇怪的是,我知道每个循环都在几毫秒内运行,但从一个循环的开始到下一个循环的开始,时间不断增加。

如果这还不足以分析我的问题,我很抱歉,但我不确定如果不显示我的整个解决方案,我还能提供什么。

谢谢。

编辑:更好的问题可能是:如果秒表不能解决问题,分析性能的好方法是什么。我宁愿不必下载分析器。

1 个答案:

答案 0 :(得分:0)

如果它花费的时间越来越长,在每次迭代时,它可能与初始cuttedWords.any()相关。

什么类型的cuttedWords?如果它是一个数据库支持的可枚举,它将在每次迭代时重新发出sql语句,这可能是你想要的也可能不是。

另一方面,如果这是生产者 - 消费者场景,则生产者可能会锁定cuttedWords,导致消费者在等待生产者完成其操作时被线程锁定。

此外,.reportProgress将导致后台工作者在创建它的线程上引发事件,可能导致UI更新,因此可能尝试删除该行并查看它是否有帮助。然后将其替换为仅在进度实际发生变化时调用reportProgress的代码。