在网络编程中,需要对数据进行序列化发送,那么如何能更快的序列化呢,数字部分
测试
C#
[MemoryDiagnoser]
public partial class Test
{
[GlobalSetup]
public void Startup()
{
}
byte[] arr = new byte[8];
uint num4 = 1;
ulong num8 = 1;
[Benchmark]
public void ArrayCopy4()
{
for (int i = 0; i < 100; i++)
BitConverter.GetBytes(num4).CopyTo(arr, 0);
}
[Benchmark]
public void ArrayCopy8()
{
for (int i = 0; i < 100; i++)
BitConverter.GetBytes(num8).CopyTo(arr, 0);
}
[Benchmark]
public void SpanCopy4()
{
for (int i = 0; i < 100; i++)
BitConverter.GetBytes(num4).AsSpan().CopyTo(arr);
}
[Benchmark]
public void SpanCopy8()
{
for (int i = 0; i < 100; i++)
BitConverter.GetBytes(num8).AsSpan().CopyTo(arr);
}
[Benchmark]
public unsafe void UnSafeSpanCopy4()
{
for (int i = 0; i < 100; i++)
{
ref uint v = ref num4;
fixed (void* p = &v)
{
new Span<byte>(p, 4).CopyTo(arr);
}
}
}
[Benchmark]
public unsafe void UnSafeSpanCopy8()
{
for (int i = 0; i < 100; i++)
{
ref ulong v = ref num8;
fixed (void* p = &v)
{
new Span<byte>(p, 8).CopyTo(arr);
}
}
}
}
基准
C#
BenchmarkDotNet=v0.13.5, OS=Windows 10 (10.0.19045.3208/22H2/2022Update)
AMD Ryzen 3 2200G with Radeon Vega Graphics, 1 CPU, 4 logical and 4 physical cores
.NET SDK=7.0.100
[Host] : .NET 7.0.0 (7.0.22.51805), X64 RyuJIT AVX2 [AttachedDebugger]
DefaultJob : .NET 7.0.0 (7.0.22.51805), X64 RyuJIT AVX2
| Method | Mean | Error | StdDev | Median | Gen0 | Allocated |
|---------------- |-----------:|---------:|----------:|-----------:|-------:|----------:|
| ArrayCopy4 | 1,199.7 ns | 22.81 ns | 20.22 ns | 1,198.6 ns | 1.5297 | 3200 B |
| ArrayCopy8 | 1,289.7 ns | 48.98 ns | 144.43 ns | 1,249.4 ns | 1.5297 | 3200 B |
| SpanCopy4 | 1,090.2 ns | 21.26 ns | 30.49 ns | 1,085.3 ns | 1.5297 | 3200 B |
| SpanCopy8 | 1,098.9 ns | 21.99 ns | 39.66 ns | 1,100.2 ns | 1.5297 | 3200 B |
| UnSafeSpanCopy4 | 461.0 ns | 9.14 ns | 8.55 ns | 463.0 ns | - | - |
| UnSafeSpanCopy8 | 462.4 ns | 8.99 ns | 11.04 ns | 457.6 ns | - | - |