byte[] data = new byte[123];
var casted_data = System.Runtime.InteropServices.MemoryMarshal.Cast<byte, UInt64>(data.AsSpan(16));
ulong udata = 0;
var t1 = System.Diagnostics.Stopwatch.StartNew();
for(int i = 0; i < 1000000000; ++i) {
udata = casted_data[0];
}
t1.Stop();
var t2 = System.Diagnostics.Stopwatch.StartNew();
unsafe {
for (int i = 0; i < 1000000000; ++i) {
fixed (byte* buffer_pntr = data) {
udata = ((ulong*)buffer_pntr)[2];
}
}
}
t2.Stop();
Console.WriteLine("Cast: {0,7:F3}ms, Unsafe: {1,7:F3}ms", t1.Elapsed.TotalMilliseconds, t2.Elapsed.TotalMilliseconds);
На дебаге +- одинаково, а на релизе:
Cast: 253,661ms, Unsafe: 1711,208ms
А почему?
Вынеси fixed за цикл
unsafe не бесплатен
вот так unsafe вдвое быстрее cast https://i.tk-chel.ru/denisio/202110/27_210205.png
Обсуждают сегодня