Najszybszy sposób czytania i pisania binarnego

Obecnie optymalizuję aplikację, jedną z często wykonywanych operacji jest czytanie i pisanie plików binarnych. Potrzebuję 2 rodzajów funkcji:

Set(byte[] target, int index, int value);

int Get(byte[] source, int index);

Funkcje te są potrzebne do podpisywania i podpisywania krótkich, int i długich w dużej i małej kolejności endian.

Oto kilka przykładów, które zrobiłem, ale potrzebuję oceny zalet i wad:

pierwsza metoda polega na użyciu Marshal do zapisania wartości w pamięci bajtu [], druga używa zwykłych wskaźników do wykonania tego, a trzecia używa BitConverter i BlockCopy, aby to zrobić

unsafe void Set(byte[] target, int index, int value)
{
    fixed (byte* p = &target[0])
    {
        Marshal.WriteInt32(new IntPtr(p), index, value);
    }
}

unsafe void Set(byte[] target, int index, int value)
{
    int* p = &value;
    for (int i = 0; i < 4; i++)
    {
        target[offset + i] = *((byte*)p + i);
    }
}

void Set(byte[] target, int index, int value)
{
    byte[] data = BitConverter.GetBytes(value);
    Buffer.BlockCopy(data, 0, target, index, data.Length);
}

A oto metody Read / Get:

pierwszy używa Marshal do odczytania wartości z bajtu [], drugi używa zwykłych wskaźników, a trzeci ponownie używa BitConverter:

unsafe int Get(byte[] source, int index)
{
    fixed (byte* p = &source[0])
    {
        return Marshal.ReadInt32(new IntPtr(p), index);
    }
}

unsafe int Get(byte[] source, int index)
{
    fixed (byte* p = &source[0])
    {
        return *(int*)(p + index);
    }
}

unsafe int Get(byte[] source, int index)
{
    return BitConverter.ToInt32(source, index);
}

kontrola granic musi być wykonana, ale nie jest jeszcze częścią mojego pytania ...

Byłbym zadowolony, gdyby ktoś mógł powiedzieć, jaki byłby najlepszy i najszybszy sposób w tym przypadku lub dać mi inne rozwiązania do pracy. Preferowane byłoby ogólne rozwiązanie

Po prostu wykonałem kilka testów wydajności, oto wyniki:

Set Marshal: 45 ms, Set Pointer: 48 ms, Set BitConverter: 71 ms Get Marshal: 45 ms, Get Pointer: 26 ms, Get BitConverter: 30 ms

wydaje się, że używanie wskaźników jest szybkim sposobem, ale myślę, że Marshal i BitConverter przeprowadzają wewnętrzne sprawdzanie ... czy ktoś może to zweryfikować?

questionAnswers(4)

yourAnswerToTheQuestion