2013-10-09 39 views
0

我正在處理大文件,並使用一些算法從MatLab轉換爲dll。其中之一是entropy.m。我轉換它的DLL,並在C#中使用它。如你所知,它需要MWArray來執行計算。我將數據存儲爲段。填寫段爲MWNumericArray。計算段的熵然後清除MWNumericArray。但是這個過程太慢了。我能做些什麼來提高程序的性能? 這裏是我的代碼:C#.Net轉換後的代碼性能問題

  NAudio.Wave.WaveChannel32 wave = new NAudio.Wave.WaveChannel32(new NAudio.Wave.WaveFileReader(open.FileName)); 
      byte[] mainBuffer = new byte[wave.WaveFormat.AverageBytesPerSecond/5]; 

      int read; 
      int length = (int)wave.Length; 
      List<MWArray> ent = new List<MWArray>(); 
      MWNumericArray arr1 = null; 
      EntropyCalculation obj = new EntropyCalculation(); 
      if (file.Length % mainBuffer.Length != 0) 
      { 
       int value = (int)(wave.Length/mainBuffer.Length); 
       length = mainBuffer.Length * value; 
      } 
      while (wave.Position != length) 
      { 
       List<double> segment = new List<double>(); 
       read = wave.Read(mainBuffer, 0, mainBuffer.Length); 
       for (int i = 0; i < read/8; i++) 
       { 
        segment.Add((BitConverter.ToSingle(mainBuffer, i * 8))); 
       } 
       arr1 = segment.ToArray(); 
       MWArray result = obj.entropy(arr1); 
       ent.Add(result); 
       arr1 = null; 
      } 
+0

使用'Uint16',而不是'int',爲什麼不創建一個'[]數組segment'直接長'閱讀/ 8' –

+0

謝謝你的建議。如你所說,我改變了代碼。但它仍然太慢。可能'obj.entropy(arr1)'需要很長時間來計算。 – Blast

+0

要知道的唯一方法是使用'StopWatch'並以不同的時間間隔放置不同的調試輸出 –

回答

0

也許你可以試試下面的代碼

while (wave.Position != length) 
      {     
       UInt16 read = wave.Read(mainBuffer, 0, mainBuffer.Length); 
       double[] segment = new double[read/8]; 
       for (UInt16 i = 0; i < segment.Length; i++) 
       { 
        segment[i] =BitConverter.ToSingle(mainBuffer, i * 8); 
       }    
       ent.Add(obj.entropy(segment));     
      } 
+0

'ent.Add(obj.entropy(segment));'您必須使用MWNumericArray作爲參數來代替段。如果我使用'double []',它不計算熵。 – Blast

+0

你可以在2個單獨的行上執行這些操作:'MWArray result = obj.entropy(segment);'和'ent.Add(result);' –

+0

.ToArray轉換爲double [] rite?所以它應該是用於計算熵的相同類型的參數? –