Skip to content

Commit a98b000

Browse files
committed
heavily optimized NetSerializer/NetPacketProcessoor
1 parent 7ab3cc0 commit a98b000

6 files changed

Lines changed: 454 additions & 465 deletions

File tree

LibSample/Program.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ static void Main(string[] args)
2323
//new HolePunchServerTest().Run();
2424
//new BroadcastTest().Run();
2525
//new BenchmarkTest.TestHost().Run();
26-
//new SerializerBenchmark().Run();
27-
new SpeedBench().Run();
26+
new SerializerBenchmark().Run();
27+
//new SpeedBench().Run();
2828
//new PacketProcessorExample().Run();
2929
}
3030
}

LibSample/SerializerBenchmark.cs

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ namespace LibSample
99
{
1010
class SerializerBenchmark
1111
{
12+
const int LoopLength = 100000;
13+
1214
[Serializable] //Just for test binary formatter
1315
private struct SampleNetSerializable : INetSerializable
1416
{
@@ -90,11 +92,43 @@ public static SomeVector2 Deserialize(NetDataReader reader)
9092
}
9193
}
9294

95+
private void NetSerializerTest(NetSerializer serializer, NetDataWriter netDataWriter, Stopwatch stopwatch, SamplePacket samplePacket)
96+
{
97+
netDataWriter.Reset();
98+
stopwatch.Restart();
99+
for (int i = 0; i < LoopLength; i++)
100+
serializer.Serialize(netDataWriter, samplePacket);
101+
stopwatch.Stop();
102+
Console.WriteLine($"NetSerializer time: {stopwatch.ElapsedMilliseconds} ms, size: { netDataWriter.Length / LoopLength} bytes");
103+
}
104+
105+
private void DataWriterTest(NetDataWriter netDataWriter, Stopwatch stopwatch, SamplePacket samplePacket)
106+
{
107+
netDataWriter.Reset();
108+
stopwatch.Restart();
109+
for (int i = 0; i < LoopLength; i++)
110+
{
111+
netDataWriter.Put(samplePacket.SomeString);
112+
netDataWriter.Put(samplePacket.SomeFloat);
113+
netDataWriter.PutArray(samplePacket.SomeIntArray);
114+
SomeVector2.Serialize(netDataWriter, samplePacket.SomeVector2);
115+
netDataWriter.Put((ushort)samplePacket.SomeVectors.Length);
116+
for (int j = 0; j < samplePacket.SomeVectors.Length; j++)
117+
{
118+
SomeVector2.Serialize(netDataWriter, samplePacket.SomeVectors[j]);
119+
}
120+
netDataWriter.Put(samplePacket.EmptyString);
121+
netDataWriter.Put(samplePacket.TestObj);
122+
}
123+
stopwatch.Stop();
124+
Console.WriteLine($"Raw time: {stopwatch.ElapsedMilliseconds} ms, size: { netDataWriter.Length / LoopLength} bytes");
125+
}
126+
93127
public void Run()
94128
{
95129
Console.WriteLine("=== Serializer benchmark ===");
96130

97-
const int LoopLength = 100000;
131+
98132
//Test serializer performance
99133
Stopwatch stopwatch = new Stopwatch();
100134
BinaryFormatter binaryFormatter = new BinaryFormatter();
@@ -114,7 +148,7 @@ public void Run()
114148
samplePacket.SomeVectors[i] = new SomeVector2(i, i);
115149
}
116150

117-
NetSerializer netSerializer = new NetSerializer();
151+
var netSerializer = new NetSerializer();
118152
netSerializer.RegisterNestedType<SampleNetSerializable>();
119153
netSerializer.RegisterNestedType( SomeVector2.Serialize, SomeVector2.Deserialize );
120154

@@ -127,52 +161,21 @@ public void Run()
127161
//Test binary formatter
128162
stopwatch.Start();
129163
for (int i = 0; i < LoopLength; i++)
130-
{
131164
binaryFormatter.Serialize(memoryStream, samplePacket);
132-
}
133165
stopwatch.Stop();
134166
Console.WriteLine("BinaryFormatter time: " + stopwatch.ElapsedMilliseconds + " ms");
167+
Console.WriteLine("BinaryFormatter size: " + memoryStream.Position / LoopLength);
135168

136-
//Test NetSerializer
137-
stopwatch.Restart();
138-
for (int i = 0; i < LoopLength; i++)
139-
{
140-
netSerializer.Serialize(netDataWriter, samplePacket);
141-
}
142-
stopwatch.Stop();
143-
Console.WriteLine("NetSerializer first run time: " + stopwatch.ElapsedMilliseconds + " ms");
169+
DataWriterTest(netDataWriter, stopwatch, samplePacket);
170+
NetSerializerTest(netSerializer, netDataWriter, stopwatch, samplePacket);
144171

145-
//Test NetSerializer
146-
netDataWriter.Reset();
147-
stopwatch.Restart();
148-
for (int i = 0; i < LoopLength; i++)
149-
{
150-
netSerializer.Serialize(netDataWriter, samplePacket);
151-
}
152-
stopwatch.Stop();
153-
Console.WriteLine("NetSerializer second run time: " + stopwatch.ElapsedMilliseconds + " ms");
172+
DataWriterTest(netDataWriter, stopwatch, samplePacket);
173+
NetSerializerTest(netSerializer, netDataWriter, stopwatch, samplePacket);
154174

155-
//Test RAW
156-
netDataWriter.Reset();
157-
stopwatch.Restart();
158-
for (int i = 0; i < LoopLength; i++)
159-
{
160-
netDataWriter.Put(samplePacket.SomeFloat);
161-
netDataWriter.Put(samplePacket.SomeString);
162-
netDataWriter.PutArray(samplePacket.SomeIntArray);
163-
netDataWriter.Put(samplePacket.SomeVector2.X);
164-
netDataWriter.Put(samplePacket.SomeVector2.Y);
165-
netDataWriter.Put(samplePacket.SomeVectors.Length);
166-
for (int j = 0; j < samplePacket.SomeVectors.Length; j++)
167-
{
168-
netDataWriter.Put(samplePacket.SomeVectors[j].X);
169-
netDataWriter.Put(samplePacket.SomeVectors[j].Y);
170-
}
171-
netDataWriter.Put(samplePacket.EmptyString);
172-
netDataWriter.Put(samplePacket.TestObj.Value);
173-
}
174-
stopwatch.Stop();
175-
Console.WriteLine("DataWriter (raw put method calls) time: " + stopwatch.ElapsedMilliseconds + " ms");
175+
DataWriterTest(netDataWriter, stopwatch, samplePacket);
176+
NetSerializerTest(netSerializer, netDataWriter, stopwatch, samplePacket);
177+
178+
Console.ReadKey();
176179
}
177180
}
178181
}

LiteNetLib/Utils/NetPacketProcessor.cs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,31 +64,28 @@ protected virtual void WriteHash<T>(NetDataWriter writer)
6464
/// Register nested property type
6565
/// </summary>
6666
/// <typeparam name="T">INetSerializable structure</typeparam>
67-
/// <returns>True - if register successful, false - if type already registered</returns>
68-
public bool RegisterNestedType<T>() where T : struct, INetSerializable
67+
public void RegisterNestedType<T>() where T : struct, INetSerializable
6968
{
70-
return _netSerializer.RegisterNestedType<T>();
69+
_netSerializer.RegisterNestedType<T>();
7170
}
7271

7372
/// <summary>
7473
/// Register nested property type
7574
/// </summary>
7675
/// <param name="writeDelegate"></param>
7776
/// <param name="readDelegate"></param>
78-
/// <returns>True - if register successful, false - if type already registered</returns>
79-
public bool RegisterNestedType<T>(Action<NetDataWriter, T> writeDelegate, Func<NetDataReader, T> readDelegate)
77+
public void RegisterNestedType<T>(Action<NetDataWriter, T> writeDelegate, Func<NetDataReader, T> readDelegate)
8078
{
81-
return _netSerializer.RegisterNestedType<T>(writeDelegate, readDelegate);
79+
_netSerializer.RegisterNestedType<T>(writeDelegate, readDelegate);
8280
}
8381

8482
/// <summary>
8583
/// Register nested property type
8684
/// </summary>
8785
/// <typeparam name="T">INetSerializable class</typeparam>
88-
/// <returns>True - if register successful, false - if type already registered</returns>
89-
public bool RegisterNestedType<T>(Func<T> constructor) where T : class, INetSerializable
86+
public void RegisterNestedType<T>(Func<T> constructor) where T : class, INetSerializable
9087
{
91-
return _netSerializer.RegisterNestedType(constructor);
88+
_netSerializer.RegisterNestedType(constructor);
9289
}
9390

9491
/// <summary>

0 commit comments

Comments
 (0)