将uint复制到字节数组并在字节数组(和后面)内进行比较的最快方法

时间:2012-07-15 23:22:27

标签: c# performance

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

  1. 将给定的uint与字节数组中的特定偏移量进行比较(也许我可以一次比较所有4个字节?)
  2. 将具有偏移量的字节数组中的4个字节复制到uint
  3. 将uint复制到字节数组中的特定偏移量(它将覆盖此数组中的4个字节)
  4. 将12个字节复制到结构:( uint,uint,byte,byte,byte,byte)
  5. 最后一个并不经常使用。但如果我能用一些不安全的操作来做这件事就会非常有趣。

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

    编辑:

    Currenlty我正在使用类似的东西将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个字节。

1 个答案:

答案 0 :(得分: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