【问题标题】:C# .Net Converted Code Performance IssueC# .Net 转换的代码性能问题
【发布时间】:2013-10-16 13:16:02
【问题描述】:

我正在处理大文件并使用一些算法从 MatLab 转换为 dll。其中之一是 entropy.m。我将它转换为 dll 并在 c# 中使用它。如您所知,它需要 MWArray 来执行计算。我将数据存储为段。将段填入MWNumericArray。计算段的熵然后清除MWNumericArray。然而这个过程太慢了。我可以做些什么来提高程序的性能? 这是我的代码:

            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;
            }

【问题讨论】:

  • 使用Uint16而不是int,为什么不直接创建一个长度为read/8Array[] segment
  • 感谢您的建议。我按你说的改了代码。不过还是太慢了。可能obj.entropy(arr1) 需要很长时间来计算。
  • 知道的唯一方法是使用StopWatch 并在不同的时间间隔放置单独的调试输出

标签: c# arrays performance matlab


【解决方案1】:

也许你可以试试下面的代码

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));                
            }

【讨论】:

  • ent.Add(obj.entropy(segment)); 您必须使用 MWNumericArray 作为参数而不是段。如果我使用double[],它不会计算熵。
  • 您可以在 MWArray result = obj.entropy(segment);ent.Add(result); 两行单独的行上执行这些操作
  • .ToArray 转换为 double[] 仪式?所以它应该是计算熵的同一类型的参数?
  • 不允许直接使用 double[]。您的逻辑似乎是正确的,但是没有采用 double[] 的熵重载方法。首先需要定义一个MWNumericArray arr1;然后输入 arr1=段;因此熵可以起作用。
猜你喜欢
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
相关资源
最近更新 更多