当前位置: 首页 > 编程语言 > C#

翻转字节数组-提高性能分享

时间:2023-04-11 01:49:54 C#

翻转字节数组-提高性能我有一些代码可以管理从传感器阵列接收的数据。控制传感器的PIC使用8个SAR-ADC并行读取4096个数据字节。这意味着它读取前8个字节的最高有效位;然后它读取第二位,依此类推,直到第八位(最低位)。基本上,对于它读取的每8个字节,它创建(并发送到计算机)8个字节,如下所示://rxData[0]=MSB[7]MSB[6]MSB[5]MSB[4]MSB[3]MSB[2]MSB[1]MSB[0]//rxData[1]=B6[7]B6[6]B6[5]B6[4]B6[3]B6[2]B6[1]B6[0]//rxData[2]=B5[7]B5[6]B5[5]B5[4]B5[3]B5[2]B5[1]B5[0]//rxData[3]=B4[7]B4[6]B4[5]B4[4]B4[3]B4[2]B4[1]B4[0]//rxData[4]=B3[7]B3[6]B3[5]B3[4]B3[3]B3[2]B3[1]B3[0]//rxData[5]=B2[7]B2[6]B2[5]B2[4]B2[3]B2[2]B2[1]B2[0]//rxData[6]=B1[7]B1[6]B1[5]B1[4]B1[3]B1[2]B1[1]B1[0]//rxData[7]=LSB[7]LSB[6]LSB[5]LSB[4]LSB[3]LSB[2]LSB[1]LSB[0]用于系统读取和处理对于所有4096字节重复该模式。想象一下,每个8字节的读取都是单独进行的,那么我们就可以把它们看成一个8by8位的数组。我需要围绕从左下角(LSB[7])到右上角(MSB[0])的对角线镜像此数组。完成后,生成的8×8位数组包含从传感器读取的正确数据字节。我曾经在PIC控制器上这样做,使用左移等,但它大大减慢了系统速度。所以现在在我们使用以下代码处理数据的计算机上执行此操作:BitArrayba=newBitArray(rxData);BitArrayba2=newBitArray(ba.Count);对于(inti=0;i>1)|((rxData[2]&0x80)>>2)|((rxData[3]&0x80)>>3)|((rxData[4]&0x80)>>4)|((rxData[5]&0x80)>>5)|((rxData[6]&0x80)>>6)|((rxData[7]&0x80)>>7);输出[1]=((rxData[0]&0x40)>1)|((rxData[3]&0x40)>>2)|((rxData[4]&0x40)>>3)|((rxData[5]&0x40)>>4)|((rxData[6]&0x40)>>5)|((rxData[7]&0x40)>>6);输出[2]=((rxData[0]&0x20)>1)|((rxData[4]&0x20)>>2)|((rxData[5]&0x20)>>3)|((rxData[6]&0x20)>>4)|((rxData[7]&0x20)>>5);输出[3]=((rxData[0]&0x10)>1)|((rxData[5]&0x10)>>2)|((rxData[6]&0x10)>>3)|((rxData[7]&0x10)>>4);输出[4]=((rxData[0]&0x08)>1)|((rxData[6]&0x08)>>2)|((rxData[7]&0x08)>>3);输出[5]=((rxData[0]&0x04)>1)|((rxData[7]&0x04)>>2);out[6]=((rxData[0]&0x02)>1);out[7]=((rxData[0]&0x01)你可能会发现BitVector比BitArray表现更好对于内部使用的布尔值和小整数,BitVector32比BitArray更高效。BitArray可以根据需要无限增长,但它有内存类实例和性能开销所需。相比之下,BitVector32仅使用32位。http://msdn.microsoft.com/en-us/library/system.collections.specialized.bitvector32.aspx如果初始化BitVector32数组并对它们进行操作,那么应该比你现在操作BitArray要快。如果用一个线程进行镜像,第二个线程可以进行顺序读分析,也可以提高性能。TaskParallelLibraryDataflow提供了一个此类框架的良好解决方案。您可以使用源块来获取数据缓冲区,使用转换块来执行镜像,并使用目标块来执行数据处理。这其实和bitboard问题中的getcolumn是一样的,所以把byte数组当成64位整型byteget_byte(ulongmatrix,uintcol){constulongcolumn_mask=0x8080808080808080ull;可以更高效的解决constulongmagic=0x2040810204081ull;ulongcolumn=((matrix>56);}//实际上不需要下面的步骤。您可以直接将rxData读入`ulong`//变量而不是位数组。如有必要,请记住更改字节顺序ulongmatrix=(rxData[7]在较新的x86CPU中,您可以使用BMI2指令集中的PDEP指令。我不确定C#中是否有相应的内在函数。如果内在函数不存在,那么您必须使用一些东西像这样上面的原生代码就是C#学习教程:翻转字节数组-提高性能分享的所有内容,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注---资料[i]=_pext_u64(matrix,column_mask本文采集自网络,不代表立场,如涉及侵权请点右联系管理员删除,转载请注明出处: