|
1 | 1 | using System.Buffers; |
2 | | -using System.IO.Pipelines; |
3 | 2 | using System.Text; |
4 | 3 | using System.Text.Json; |
5 | 4 | using BenchmarkDotNet.Attributes; |
|
9 | 8 | using MessagePack; |
10 | 9 | using Microsoft.Extensions.DependencyInjection; |
11 | 10 | using Orleans.Serialization; |
12 | | -using Orleans.Serialization.Buffers; |
13 | | -using Orleans.Serialization.Session; |
14 | | -using Xunit; |
15 | 11 |
|
16 | 12 | namespace Benchmarks.Serialization.Comparison; |
17 | 13 |
|
| 14 | +#pragma warning disable IDE1006 // Naming Styles |
18 | 15 | /// <summary> |
19 | | -/// Compares Orleans serialization performance against other popular serializers for array types. |
| 16 | +/// Compares Orleans deserialization performance against other popular serializers for array types. |
20 | 17 | /// </summary> |
21 | 18 | [GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)] |
22 | 19 | [Config(typeof(BenchmarkConfig))] |
23 | 20 | [BenchmarkCategory("Serialization")] |
24 | | -public class ArraySerializeBenchmark |
| 21 | +public class ArrayDeserializeBenchmark |
25 | 22 | { |
26 | 23 | private static readonly MyVector3[] _value; |
27 | 24 | private static readonly Serializer<MyVector3[]> _orleansSerializer; |
28 | | - private static readonly SerializerSession _session; |
29 | | - private static readonly ArrayBufferWriter<byte> _arrayBufferWriter; |
30 | | - private static readonly Utf8JsonWriter _jsonWriter; |
31 | | - private static readonly MemoryStream _stream; |
32 | | - private static readonly Pipe _pipe; |
| 25 | + private static readonly byte[] _stjPayload; |
| 26 | + private static readonly byte[] _protobufPayload; |
| 27 | + private static readonly byte[] _orleansPayload; |
| 28 | + private static readonly byte[] _messagePackPayload; |
33 | 29 |
|
34 | | - static ArraySerializeBenchmark() |
| 30 | + static ArrayDeserializeBenchmark() |
35 | 31 | { |
36 | 32 | _value = Enumerable.Repeat(new MyVector3 { X = 10.3f, Y = 40.5f, Z = 13411.3f }, 1000).ToArray(); |
37 | 33 | var serviceProvider = new ServiceCollection() |
38 | | - .AddSerializer(builder => builder.AddAssembly(typeof(ArraySerializeBenchmark).Assembly)) |
| 34 | + .AddSerializer() |
39 | 35 | .BuildServiceProvider(); |
40 | 36 | _orleansSerializer = serviceProvider.GetRequiredService<Serializer<MyVector3[]>>(); |
41 | | - _session = serviceProvider.GetRequiredService<SerializerSessionPool>().GetSession(); |
42 | 37 |
|
43 | | - // create buffers |
44 | | - _stream = new MemoryStream(); |
45 | 38 |
|
46 | | - var serialize1 = _orleansSerializer.SerializeToArray(_value); |
47 | | - var serialize2 = MessagePackSerializer.Serialize(_value); |
48 | | - ProtoBuf.Serializer.Serialize(_stream, _value); |
49 | | - var serialize3 = _stream.ToArray(); |
50 | | - _stream.Position = 0; |
51 | | - var serialize4 = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(_value)); |
| 39 | + _orleansPayload = _orleansSerializer.SerializeToArray(_value); |
| 40 | + _messagePackPayload = MessagePackSerializer.Serialize(_value); |
52 | 41 |
|
53 | | - _arrayBufferWriter = new ArrayBufferWriter<byte>(new[] { serialize1, serialize2, serialize3, serialize4 }.Max(x => x.Length)); |
54 | | - _jsonWriter = new Utf8JsonWriter(_arrayBufferWriter); |
55 | | - |
56 | | - _pipe = new Pipe(new PipeOptions(readerScheduler: PipeScheduler.Inline, writerScheduler: PipeScheduler.Inline, pauseWriterThreshold: 0)); |
57 | | - } |
58 | | - |
59 | | - // return byte[] |
60 | | - |
61 | | - [Benchmark(Baseline = true), BenchmarkCategory(" byte[]")] |
62 | | - public byte[] MessagePackSerialize() |
63 | | - { |
64 | | - return MessagePackSerializer.Serialize(_value); |
| 42 | + var stream = new MemoryStream(); |
| 43 | + ProtoBuf.Serializer.Serialize(stream, _value); |
| 44 | + stream.Position = 0; |
| 45 | + _protobufPayload = stream.ToArray(); |
| 46 | + _stjPayload = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(_value)); |
65 | 47 | } |
66 | 48 |
|
67 | | - [Benchmark, BenchmarkCategory(" byte[]")] |
68 | | - public byte[] ProtobufNetSerialize() |
69 | | - { |
70 | | - ProtoBuf.Serializer.Serialize(_stream, _value); |
71 | | - var array = _stream.ToArray(); |
72 | | - _stream.Position = 0; |
73 | | - return array; |
74 | | - } |
75 | | - |
76 | | - [Benchmark, BenchmarkCategory(" byte[]")] |
77 | | - public byte[] SystemTextJsonSerialize() |
78 | | - { |
79 | | - JsonSerializer.Serialize(_stream, _value); |
80 | | - var array = _stream.ToArray(); |
81 | | - _stream.Position = 0; |
82 | | - return array; |
83 | | - } |
84 | | - |
85 | | - [Benchmark, BenchmarkCategory(" byte[]")] |
86 | | - public byte[] OrleansSerialize() |
87 | | - { |
88 | | - return _orleansSerializer.SerializeToArray(_value); |
89 | | - } |
90 | | - |
91 | | - // use BufferWriter |
92 | | - |
93 | | - [Fact] |
94 | | - [Benchmark(Baseline = true), BenchmarkCategory("BufferWriter")] |
95 | | - public void MessagePackBufferWriter() |
96 | | - { |
97 | | - MessagePackSerializer.Serialize(_arrayBufferWriter, _value); |
98 | | - _arrayBufferWriter.Clear(); |
99 | | - } |
| 49 | + [Benchmark(Baseline = true)] |
| 50 | + public MyVector3[] MessagePackDeserialize() => MessagePackSerializer.Deserialize<MyVector3[]>(_messagePackPayload); |
100 | 51 |
|
101 | | - [Fact] |
102 | | - [Benchmark, BenchmarkCategory("BufferWriter")] |
103 | | - public void ProtobufNetBufferWriter() |
104 | | - { |
105 | | - ProtoBuf.Serializer.Serialize(_arrayBufferWriter, _value); |
106 | | - _arrayBufferWriter.Clear(); |
107 | | - } |
108 | | - |
109 | | - [Fact] |
110 | | - [Benchmark, BenchmarkCategory("BufferWriter")] |
111 | | - public void SystemTextJsonBufferWriter() |
112 | | - { |
113 | | - JsonSerializer.Serialize(_jsonWriter, _value); |
114 | | - _jsonWriter.Flush(); |
115 | | - _arrayBufferWriter.Clear(); |
116 | | - _jsonWriter.Reset(_arrayBufferWriter); |
117 | | - } |
118 | | - |
119 | | - [Fact] |
120 | | - [Benchmark, BenchmarkCategory("BufferWriter")] |
121 | | - public void OrleansBufferWriter() |
122 | | - { |
123 | | - var writer = Writer.CreatePooled(_session); |
124 | | - try |
125 | | - { |
126 | | - _orleansSerializer.Serialize(_value, ref writer); |
127 | | - } |
128 | | - finally |
129 | | - { |
130 | | - writer.Dispose(); |
131 | | - _session.Reset(); |
132 | | - } |
133 | | - } |
134 | | - |
135 | | - [Fact] |
136 | | - [Benchmark, BenchmarkCategory("BufferWriter")] |
137 | | - public void OrleansBufferWriter2() |
138 | | - { |
139 | | - // wrap ArrayBufferWriter<byte> |
140 | | - var writer = _arrayBufferWriter.CreateWriter(_session); |
141 | | - try |
142 | | - { |
143 | | - _orleansSerializer.Serialize(_value, ref writer); |
144 | | - } |
145 | | - finally |
146 | | - { |
147 | | - writer.Dispose(); |
148 | | - _session.Reset(); |
149 | | - } |
150 | | - |
151 | | - _arrayBufferWriter.Clear(); // clear ArrayBufferWriter<byte> |
152 | | - } |
| 52 | + [Benchmark] |
| 53 | + public MyVector3[] ProtobufNetDeserialize() => ProtoBuf.Serializer.Deserialize<MyVector3[]>(_protobufPayload.AsSpan()); |
153 | 54 |
|
154 | | - [Fact] |
155 | 55 | [Benchmark] |
156 | | - public void OrleansPipeWriter() |
157 | | - { |
158 | | - var writer = _pipe.Writer.CreateWriter(_session); |
159 | | - _orleansSerializer.Serialize(_value, ref writer); |
160 | | - _session.Reset(); |
| 56 | + public MyVector3[] SystemTextJsonDeserialize() => JsonSerializer.Deserialize<MyVector3[]>(_stjPayload); |
161 | 57 |
|
162 | | - _pipe.Writer.Complete(); |
163 | | - _pipe.Reader.Complete(); |
164 | | - _pipe.Reset(); |
165 | | - } |
| 58 | + [Benchmark] |
| 59 | + public MyVector3[] OrleansDeserialize() => _orleansSerializer.Deserialize(_orleansPayload); |
166 | 60 | } |
| 61 | +#pragma warning restore IDE1006 // Naming Styles |
0 commit comments