2014-06-06 113 views
0

我創建了一個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

回答

0

如果它在每次迭代中花費的時間越來越長,它可能與最初的cuttedWords.any()有關。

什麼類型是cuttedWords?如果它是一個數據庫支持的枚舉,它將在每次迭代時重新發出sql語句,這可能是也可能不是你想要的。另一方面,如果這是一個生產者 - 消費者場景,可能是生產者鎖定了cuttedWords,從而導致消費者在等待生產者完成其操作時被鎖定線程。

此外,.reportProgress將導致backgroundworker在創建它的線程上引發事件,可能導致UI更新,因此可能嘗試刪除該行並查看它是否有幫助。然後用一些只調用reportProgress的代碼替換它,如果進度實際發生了變化。

+0

cuttedWords是IEnumberable類型 user2340818

+0

我不認爲.reportProgess是問題,因爲整個循環運行很快。這是迭代之間的問題。 – user2340818

+0

你可以嘗試在第一次迭代之前調用.ToList()嗎? – Soraz

相關問題