我需要从一个设备中连续填充16384个双元素的数组,该设备提供长度为332个元素的数据数组(这些数据的数据类型为short)。目前复制需要28ms来填充16384元素阵列。我想至少在10ms之内得到这个。在下面的代码中,方法getData返回两个332个元素的短数组(iBuf和qBuf)。此方法需要14个刻度(3uS),因此与速度无关。
getData();
while (keepGoing)
{
for (int i = 0; i < 16384; i++)
{
iData[i] = ibuf[rawCounter];
qData[i] = qbuf[rawCounter];
rawCounter++;
if (rawCounter == samplesPerPacket)
{
getData();
rawCounter = 0;
}
//processing of data occurs here
}
感谢您提供任何帮助和建议
答案 0 :(得分:2)
使用Array.copy方法可能会对您有所帮助
while(keeping)
{
Array.Copy(ibuf,0,iData,counter,iData.Length)
counter += iData.Length
//Exit while once you hit 16384
//Might also need to check you don't overflow buffer since 16384 doesn't divide evenly into 332.
}
答案 1 :(得分:0)
首先,您的代码不会按原样编译。尝试编辑以做出您想要完成的事情的最小示例。您缺少初始化(new
语句),看起来您正在用C#编写Java代码。
至少使用Array.Copy()
。或者,您可以使用指针(如果缓冲区包含内部值)或复制BlockCopy()
之前提到的bytes
。使用sizeof()
函数查找每个元素的字节数。
答案 2 :(得分:0)
您可以使用以下技术,我们利用处理器为32位(4字节)的事实,在64位处理器上,您只需要在方法中将4替换为8。
public static unsafe void CopyUnsafe(byte[] sourceArray, int sourceIndex, byte[] destinationArray, int destinationIndex, int length)
{
const int procInstrSize = 4;
fixed (byte* pDst = &destinationArray[destinationIndex])
{
fixed (byte* source = &sourceArray[sourceIndex])
{
byte* ps = source;
byte* pd = pDst;
// Loop over the count in blocks of 4 bytes, copying an integer (4 bytes) at a time:
for (int i = 0; i < length / procInstrSize; i++)
{
*((int*) pd) = *((int*) ps);
pd += procInstrSize;
ps += procInstrSize;
}
// Complete the copy by moving any bytes that weren't moved in blocks of 4:
for (int i = 0; i < length % procInstrSize; i++)
{
*pd = *ps;
pd++;
ps++;
}
}
}
}