0

byte[]構造体に変換する方法が2つ見つかりました。しかし、これら2つの方法に違いがあるかどうかはわかりませんか? 誰がどちらが優れているか(パフォーマンスなど)を知ることができますか?

#1:

public static T ByteArrayToStructure<T>(byte[] buffer)
{
    int length = buffer.Length;
    IntPtr i = Marshal.AllocHGlobal(length);
    Marshal.Copy(buffer, 0, i, length);
    T result = (T)Marshal.PtrToStructure(i, typeof(T));
    Marshal.FreeHGlobal(i);
    return result;
}

#2:

public static T ByteArrayToStructure<T>(byte[] buffer)
{
    GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
    T result = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
    handle.Free();
    return result;
}
4

1 に答える 1

2

次のコードを使用してベンチマークを行いました。

const int ILITERATIONS = 10000000;

const long testValue = 8616519696198198198;
byte[] testBytes = BitConverter.GetBytes(testValue);

// warumup JIT
ByteArrayToStructure1<long>(testBytes);
ByteArrayToStructure2<long>(testBytes);

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();

for (int i = 0; i < ILITERATIONS; i++)
{
    ByteArrayToStructure1<long>(testBytes);
}

stopwatch.Stop();
Console.WriteLine("1: " + stopwatch.ElapsedMilliseconds);

stopwatch.Reset();

stopwatch.Start();

for (int i = 0; i < ILITERATIONS; i++)
{
    ByteArrayToStructure2<long>(testBytes);
}

stopwatch.Stop();
Console.WriteLine("2: " + stopwatch.ElapsedMilliseconds);

stopwatch.Reset();

stopwatch.Start();

for (int i = 0; i < ILITERATIONS; i++)
{
    BitConverter.ToInt64(testBytes, 0);
}

stopwatch.Stop();
Console.WriteLine("3: " + stopwatch.ElapsedMilliseconds);

Console.ReadLine();

次の結果になりました。

1: 2927
2: 2803
3: 51
于 2013-01-22T19:04:57.970 に答える