【问题标题】:I can't figure out what is slowing my program down我不知道是什么让我的程序变慢了
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • cuttedWords 是 IEnumberable 类型
  • 我认为 .reportProgess 不是问题,因为整个循环运行得很快。问题在于迭代之间。
  • 你能在第一次迭代之前尝试调用 .ToList() 吗?
  • 我会试试的。这将实现什么?
猜你喜欢
  • 2016-04-01
  • 1970-01-01
  • 2020-04-09
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
相关资源
最近更新 更多