我在C#中有一个uint类型的数组,检查程序是否在低端字节序的计算机上工作后,我想将数据转换为大端字节序类型。因为数据量可能非常大,但始终是偶数,所以我一直在考虑将两种uint类型作为ulong类型,以实现更好的性能并在ASM中对其进行编程,因此我正在寻找一种速度非常快(如果可能的话,最快的一种) )汇编程序算法,将little-endian转换为big-endian。

最佳答案

对于大量数据,要使用bswap指令(在Visual C++中为 _byteswap_ushort , _byteswap_ulong , and _byteswap_uint64 内部函数提供)。这甚至会胜过手写组装。在没有P/Invoke的纯C#中,这些功能不可用,因此:

  • 仅当您有大量数据要进行字节交换时才使用此选项。
  • 您应该认真考虑使用托管C++编写最低级别的应用程序I/O,以便可以在将数据放入托管阵列之前进行交换。您已经必须编写一个C++库,因此损失不多,并且避免了针对大型数据集上运行的低复杂度算法的所有与P/Invoke相关的性能问题。

  • PS:许多人不知道字节交换内在函数。它们的性能是惊人的,对于浮点数据则是如此,因为它会将它们作为整数进行处理。如果没有为每个单字节交换用例手动编码寄存器负载,就无法克服它,如果您尝试这样做,可能会给优化器带来比以往任何时候都大的打击。

    关于c# - 在ASM中快速从小尾数到大尾数转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1358747/

    10-12 16:47
    查看更多