3

次のことを頻繁に行う必要があります (ここではエンディアンを無視できます。x86 のみを使用します)。

  1. 特定の uint をバイト配列内の特定のオフセットと比較します (4 バイトすべてを一度に比較できるでしょうか?)
  2. オフセット付きのバイト配列から 4 バイトを uint にコピーします
  3. uint をバイト配列の特定のオフセットにコピーします (この配列の 4 バイトを上書きします)
  4. 12 バイトを構造体にコピーします: (uint, uint, byte, byte,byte, byte)

最後のものはあまり使われません。しかし、安全でない操作だけでそれを行うことができれば、非常に興味深いでしょう。

それを行う最も速い方法は何ですか?1 つ目は、私が最も多く実行し、最も多くの 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)

最後のコードは非常に少ないコードで、最初のコードは非常に多く、最適化が行われている可能性があります。比較のために、現在はそれを元に戻して (2 番目のもの)、比較したい値と uint を比較します。

BitConverter.ToUInt32(arr, offset) == myVal

4 番目の部分 (構造体の抽出) では、次のようなものを使用しています。

    [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 に答える