Skip to content

Microbenchmark

This page contains performance comparison data between Nino, MessagePack, and MemoryPack

Data Structures

csharp
[NinoType]
[MemoryPackable]
[MessagePackObject]
public partial class SimpleClass
{
    [Key(0)]
    public int Id;
    [Key(1)]
    public string Name { get; set; }
    [Key(2)]
    public int[] Numbers { get; set; }
    [Key(3)]
    public List<DateTime> Dates { get; set; }
    [Key(4)]
    public Dictionary<int, string> Map1;
    [Key(5)]
    public Dictionary<int, int> Map2 { get; set; }
}
csharp
[NinoType]
[MemoryPackable]
[MessagePackObject]
public partial struct SimpleStruct
{
    [Key(0)]
    public int Id;
    [Key(1)]
    public DateTime CreateTime;
}

Data Generation

Generation Function

csharp
public static SimpleClass Create()
{
    Random random = new Random();
    return new SimpleClass
    {
        Id = random.Next(),
        Name = "SimpleClass",
        Numbers = Enumerable.Range(0, 100).Select(n => random.Next()).ToArray(),
        Dates = Enumerable.Range(0, 10).Select(n => DateTime.Now.AddSeconds(random.Next())).ToList(),
        Map1 = Enumerable.Range(0, 10).ToDictionary(n => n, n => n.ToString()),
        Map2 = Enumerable.Range(0, 10).ToDictionary(n => n, n => n * 2)
    };
}
csharp
public static SimpleStruct Create()
{
    Random random = new Random();
    return new SimpleStruct
    {
        Id = random.Next(),
        CreateTime = DateTime.Now.AddSeconds(random.Next())
    };
}

Benchmark Data

csharp
_simpleClass = SimpleClass.Create();
_simpleClasses = Enumerable.Range(0, 30).Select(_ => SimpleClass.Create()).ToArray();
_simpleStruct = SimpleStruct.Create();
_simpleStructs = Enumerable.Range(0, 30).Select(_ => SimpleStruct.Create()).ToArray();

Benchmark Environment

BenchmarkDotNet v0.14.0, macOS Sonoma 14.4 (23E214) [Darwin 23.4.0]
Apple M1, 1 CPU, 8 logical and 8 physical cores
.NET SDK 9.0.100-rc.2.24474.11
  [Host]     : .NET 8.0.6 (8.0.624.26715), Arm64 RyuJIT AdvSIMD
  Job-IBNCAG : .NET 9.0.0 (9.0.24.47305), Arm64 RyuJIT AdvSIMD

Runtime=.NET 9.0  IterationCount=20  WarmupCount=1

Benchmark Result

Results are the time taken to serialize and deserialize the above data, in nanoseconds, the lower the better

Bar Chart

Results Table

MethodMeanErrorStdDevRatioRatioSDPayload
MessagePackDeserializeSimpleClass1,189.1591 ns2.6112 ns3.0071 ns3.440.02-
MemoryPackDeserializeSimpleClass386.6335 ns6.0955 ns6.2597 ns1.120.02-
NinoDeserializeSimpleClass345.9820 ns1.2995 ns1.3345 ns1.000.01-
MessagePackSerializeSimpleClass1,638.9940 ns4.8849 ns5.4295 ns8.340.03674B
MemoryPackSerializeSimpleClass345.3897 ns0.5703 ns0.6102 ns1.760.00730B
NinoSerializeSimpleClass196.4610 ns0.1776 ns0.2045 ns1.000.00738B
MessagePackDeserializeSimpleClasses118,102.4352 ns43.1878 ns48.0031 ns3.110.01-
MemoryPackDeserializeSimpleClasses39,079.8249 ns32.2887 ns33.1581 ns1.030.00-
NinoDeserializeSimpleClasses37,926.0608 ns96.1285 ns106.8466 ns1.000.00-
MessagePackSerializeSimpleClasses190,110.8829 ns646.5527 ns744.5710 ns11.290.0965.82KB
MemoryPackSerializeSimpleClasses31,656.0714 ns94.5945 ns105.1415 ns1.880.0171.29KB
NinoSerializeSimpleClasses16,840.9377 ns111.0911 ns123.4774 ns1.000.0172.08KB
MessagePackDeserializeSimpleStruct48.9905 ns0.0223 ns0.0219 ns130.800.17-
MemoryPackDeserializeSimpleStruct0.9634 ns0.0158 ns0.0169 ns2.570.04-
NinoDeserializeSimpleStruct0.3746 ns0.0004 ns0.0005 ns1.000.00-
MessagePackSerializeSimpleStruct141.2677 ns0.3008 ns0.3343 ns38.200.1916B
MemoryPackSerializeSimpleStruct3.9620 ns0.0240 ns0.0246 ns1.070.0116B
NinoSerializeSimpleStruct3.6983 ns0.0161 ns0.0172 ns1.000.0116B
MessagePackDeserializeSimpleStructs2,794.3856 ns2.4233 ns2.7907 ns33.280.15-
MemoryPackDeserializeSimpleStructs111.8475 ns0.3823 ns0.3926 ns1.330.01-
NinoDeserializeSimpleStructs83.9682 ns0.3803 ns0.3905 ns1.000.01-
MessagePackSerializeSimpleStructs13,915.2471 ns18.5713 ns19.8711 ns171.610.321.57KB
MemoryPackSerializeSimpleStructs86.5175 ns1.1389 ns1.3116 ns1.070.021.57KB
NinoSerializeSimpleStructs81.0850 ns0.1019 ns0.1047 ns1.000.001.57KB