我找不出什么在减慢我的程序的速度

问题描述:

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

内存使用情况如何?如果内存使用量增加很快,那可能是原因。 – Matt

+1

我很确定我已阅读过有关Skip的潜在性能问题。一种解决方案是使用“Batch”扩展方法(例如https://code.google.com/p/morelinq/source/browse/MoreLinq/Batch.cs?r=f85495b139a19bce7df2be98ad88754ba8932a28)。然而,这是纯粹的猜测,因为我无法明显地调试你的代码与你的数据集。 –

+0

@Matt这是一个很好的问题。我会研究一下。我可以跟踪断点和/或跟踪点的内存使用情况吗? – user2340818

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

什么类型是cuttedWords?如果它是一个数据库支持的枚举,它将在每次迭代时重新发出sql语句,这可能是也可能不是你想要的。另一方面,如果这是一个生产者 - 消费者场景,可能是生产者锁定了cuttedWords,从而导致消费者在等待生产者完成其操作时被锁定线程。

此外,.reportProgress将导致backgroundworker在创建它的线程上引发事件,可能导致UI更新,因此可能尝试删除该行并查看它是否有帮助。然后用一些只调用reportProgress的代码替换它,如果进度实际发生了变化。

+0

cuttedWords是IEnumberable类型 user2340818

+0

我不认为.reportProgess是问题,因为整个循环运行很快。这是迭代之间的问题。 – user2340818

+0

你可以尝试在第一次迭代之前调用.ToList()吗? – Soraz