C#.Net转换代码性能问题

C#.Net转换代码性能问题,c#,arrays,performance,matlab,C#,Arrays,Performance,Matlab,我正在处理大文件,并使用一些算法将MatLab转换为dll。其中之一是熵。我将其转换为dll并在c#中使用。正如您所知,它需要MWArray来执行计算。我将数据存储为段。将段填充到MWNumericArray中。计算段的熵,然后清除MWNumericArray。但是这个过程太慢了。我可以做些什么来提高程序的性能? 这是我的密码: NAudio.Wave.WaveChannel32 wave = new NAudio.Wave.WaveChannel32(new NAudi

我正在处理大文件,并使用一些算法将MatLab转换为dll。其中之一是熵。我将其转换为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;
            }
NAudio.Wave.WaveChannel32 Wave=new NAudio.Wave.WaveChannel32(new NAudio.Wave.waveilereader(open.FileName));
字节[]主缓冲区=新字节[wave.WaveFormat.AverageBytesPerSecond/5];
int-read;
int length=(int)波长;
List ent=新列表();
MWNumericArray arr1=null;
EntropyCalculation obj=新EntropyCalculation();
if(file.Length%mainBuffer.Length!=0)
{
int值=(int)(wave.Length/mainBuffer.Length);
长度=主缓冲区。长度*值;
}
while(wave.Position!=长度)
{
列表段=新列表();
read=wave.read(mainBuffer,0,mainBuffer.Length);
对于(int i=0;i
也许你可以试试下面的代码

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));                
            }
while(wave.Position!=长度)
{                
UInt16 read=wave.read(mainBuffer,0,mainBuffer.Length);
double[]段=新的double[read/8];
对于(UInt16 i=0;i
使用
Uint16
而不是
int
,为什么不直接创建长度为
read/8
数组[]段
,谢谢您的建议。我按你说的更改了密码。不过还是太慢了。可能
obj.entropy(arr1)
需要很长时间来计算。唯一知道的方法是使用
StopWatch
并在不同的时间间隔放置单独的调试输出
ent.Add(obj.entropy(segment))必须使用MWNumericArray作为参数,而不是段。如果我使用
double[]
,它不会计算熵。您可以在两个单独的行上执行这些操作
MWArray result=obj.entropy(段)
ent.Add(结果).ToArray是否转换为双精度[]格式?所以它应该是计算熵的同一类型的参数?它不允许直接使用double[]。您的逻辑似乎是正确的,但没有一种熵重载方法需要双[]。首先需要定义MWNumericArray arr1;然后输入arr1=段;因此熵可以起作用。