ASM中快速的little-endian到big-endian转换

Wil*_*sem 5 c# algorithm performance assembly endianness

我在C#中有一个uint类型数组,在检查程序是否在小端机器上运行之后,我想将数据转换为big-endian类型.因为数据量可能变得非常大但总是均匀,我想考虑将两种uint类型作为ulong类型,以获得更好的性能并在ASM中对其进行编程,因此我搜索的速度非常快(如果可能的话,速度最快) )汇编程序算法转换big-endian的big-endian.

Sam*_*ell 7

对于大量的数据,所述bswap指令(下可用在Visual C++ _byteswap_ushort,_byteswap_ulong_byteswap_uint64内在)是去的方式.这甚至会超过手写组装.没有P/Invoke的纯C#中没有这些,所以:

  1. 只有在有大量数据要进行字节交换时才使用它.
  2. 您应该认真考虑在托管C++中编写最低级别的应用程序I/O,以便在将数据导入托管阵列之前进行交换.您已经必须编写一个C++库,因此没有太多损失,您可以回避在大型数据集上运行的低复杂度算法的所有与P/Invoke相关的性能问题.

PS:很多人都不知道字节交换内在函数.它们的性能令人惊讶,对于浮点数据来说是双倍的,因为它将它们作为整数处理.如果不为每个单字节交换用例手动编码寄存器负载,就没有办法击败它,如果你尝试这样做,你可能会在优化器中产生比你想要的更大的命中.