C#.Net转换代码性能问题
我正在处理大文件,并使用一些算法将MatLab转换为dll。其中之一是熵。我将其转换为dll并在c#中使用。正如您所知,它需要MWArray来执行计算。我将数据存储为段。将段填充到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
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=段;因此熵可以起作用。