3

我需要经常做以下事情(这里可以忽略字节顺序,我只使用x86):

  1. 将给定的 uint 与字节数组中的特定偏移量进行比较(也许我可以一次比较所有 4 个字节?)
  2. 将带有偏移量的字节数组中的 4 个字节复制到 uint
  3. 将 uint 复制到字节数组中的特定偏移量(它将覆盖此数组中的 4 个字节)
  4. 将 12 个字节复制到一个结构:(uint, uint, byte, byte,byte, byte)

最后一个不常用。但是,如果我可以通过一些不安全的操作来做到这一点,那将是非常有趣的。

最快的方法是什么?第一个是最重要的,因为我做的最多,并且使用最多的 CPU 时间。不安全的代码是可能的(如果它更快的话)。

编辑:

目前我正在使用这样的东西将一个 uint 复制到一个字节数组中:

 public static void Copy(uint i, byte[] arr, int offset)
    {
        var v = BitConverter.GetBytes(i);
        arr[offset] = v[0];
        arr[offset + 1] = v[0 + 1];
        arr[offset + 2] = v[0 + 2];
        arr[offset + 3] = v[0 + 3];
    }

对于反向转换,我使用这个:

BitConverter.ToUInt32(arr, offset)

最后一个代码这么少,第一个这么多,也许有优化。为了比较,目前我将其转换回来(第二个),然后将 uint 与我要比较的值进行比较:

BitConverter.ToUInt32(arr, offset) == myVal

对于第四部分(提取结构),我使用的是这样的:

    [StructLayout(LayoutKind.Explicit, Size = 12)]
    public struct Bucket
    {
        [FieldOffset(0)]
        public uint int1;
        [FieldOffset(4)]
        public uint int2;
        [FieldOffset(8)]
        public byte byte1;
        [FieldOffset(9)]
        public byte byte2;
        [FieldOffset(10)]
        public byte byte3;
        [FieldOffset(11)]
        public byte byte4;
    }

    public static Bucket ExtractValuesToStruct(byte[] arr, int offset)
    {
        var b = new Bucket();
        b.int1 = BitConverter.ToUInt32(arr, offset);
        b.int2 = BitConverter.ToUInt32(arr, offset + 4);
        b.byte1 = arr[offset + 8];
        b.byte2 = arr[offset + 9];
        b.byte3 = arr[offset + 10];
        b.byte4 = arr[offset + 11];
        return b;
    }

我认为使用不安全的代码我应该能够一次复制 12 个字节。

4

1 回答 1

3

将 uint 复制到字节数组中的特定偏移量

  unsafe public static void UnsafeCopy(uint i, byte[] arr, int offset)
  {
    fixed (byte* p = arr)
    {
      *((uint*)(p + offset)) = i;
    }
  }
  public static void ShiftCopy(uint i, byte[] arr, int offset)
  {
    arr[offset] = (byte)(i & 0xFF);
    arr[offset + 1] = (byte)((i >> 8) & 0xFF);
    arr[offset + 2] = (byte)((i >> 16) & 0xFF);
    arr[offset + 3] = (byte)((i >> 24) & 0xFF);
  } 

统计数据(1 000 000 次通话)

00:00:00.0414024: copy. get bytes
00:00:00.0136741: unsafe copy
00:00:00.0154764: shift  copy
于 2012-07-15T23:50:50.577 回答