C#学习教程:使用16位字在C#中更快地交换字节顺序(byte[]data){for(inti=0;i_temp.Length){_temp=newbyte[data.Length];}Buffer.BlockCopy(data,1,_temp,0,data.Length-1);for(inti=0;i我的基准假设该方法被重复调用,因此调整_temp数组的大小不是一个因素。此方法依赖于您可以使用初始Buffer.BlockCopy(...)call(sourcepositionoffset1)做一半的字节交换。如果我完全失去理智,请自己测试。在我的测试中,这个方法和原始方法(我修改为Declaringbyteb循环外)大约是70%。我一直很喜欢这个:publicstaticInt64SwapByteOrder(Int64value){varuvalue=(UInt64)value;UInt64交换=((0x00000000000000FF)&(uvalue>>56)|(0x000000000000FF00)&(uvalue>>40)|(0x0000000000FF0000)&(uvalue>>24)|(0x00000000FF000000)&(uvalue>>08000)|(0000000))&(uvalue我相信你会发现这是最快的方法,而且可读性和安全性很强。显然这适用于64位值,但同样的技术可用于32或16-。next方法几乎比接受的答案快3倍。(当超过3个字符或6个字节时总是更快,小于或等于3个字符或6个字节时速度较慢。)(请注意,接受的答案可以读/写超出数组的范围。)(更新虽然有指针,但不需要调用属性来获取长度。使用这个指针会更快一些但需要运行时检查,或者为每个平台构建项目配置作为在下面的示例中。在每个配置下定义x86和x64。)staticunsafevoidSwapV2(byte[]source){fixed(byte*psource=source){#ifX86varlength=*((uint*)(psource-4))&0xFFFFFFFEU;#elifX64varlength=*((uint*)(psource-8))&0xFFFFFFFEU;#elsevarlength=(source.Length&0xFFFFFFFE);#endifwhile(长度>7){长度-=8;ulong*pulong=(ulong*)(psource+length);*pulong=(((*pulong>>8)&0x00FF00FF00FF00FFUL)|((*pulong3){长度-=4;uint*puint=(uint*)(psource+length);*puint=(((*puint>>8)&0x00FF00FFU)|((*puint1){ushort*pushort=(ushort*)psource;*pushort=(ushort)((*pushort>>8)|(*pushort五次测试,300.000次8192字节五次测试50.000.000次6字节但是,如果数据很大并且性能很重要,则可以使用SSE或AVX。(快13倍。)https://pastebin.com/WaFk275U测试了5次,100000次循环,8192字节或4096个字符好吧,你可以使用XOR交换技巧,以避免中间字节。但是,它不会更快,如果IL完全相同,我也不会感到惊讶。以上就是C#学习教程:使用16位字在C#中更快地交换字节序。分享的所有内容,如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注---for(inti=0;i本文收集自网络,并非原创代表立场,如涉及侵权,请点击右侧联系管理员删除,如需转载请注明出处: