# C# 数字类型序列化

在网络编程中,需要对数据进行序列化发送,那么如何能更快的序列化呢,数字部分

测试

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 |      - |         - |