From 151237a7b7f627391a1eeb0899489f90b953bc54 Mon Sep 17 00:00:00 2001 From: Mitrofanov Mikhail Date: Wed, 9 Jul 2025 12:01:08 +0300 Subject: [PATCH] Faster cbor. Up to 234 000 rps --- Example.Load/Example.Load.csproj | 16 ++++++ Example.Load/Program.cs | 76 +++++++++++++++++++++++++++ mROA.Cbor/CborSerializationToolkit.cs | 12 +++-- 3 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 Example.Load/Example.Load.csproj create mode 100644 Example.Load/Program.cs diff --git a/Example.Load/Example.Load.csproj b/Example.Load/Example.Load.csproj new file mode 100644 index 0000000..affee32 --- /dev/null +++ b/Example.Load/Example.Load.csproj @@ -0,0 +1,16 @@ + + + + Exe + net9.0 + enable + enable + true + true + + + + + + + diff --git a/Example.Load/Program.cs b/Example.Load/Program.cs new file mode 100644 index 0000000..679ff9e --- /dev/null +++ b/Example.Load/Program.cs @@ -0,0 +1,76 @@ +using System.Net; +using Example.Shared; +using mROA.Abstract; +using mROA.Cbor; +using mROA.Codegen; +using mROA.Implementation; +using mROA.Implementation.Backend; +using mROA.Implementation.Bootstrap; +using mROA.Implementation.Frontend; + +const int C = 100; +var time = TimeSpan.FromSeconds(10); +Console.WriteLine($"Starting bench for {time} from {C} connections"); +var cts = new CancellationTokenSource(); +new RemoteTypeBinder(); + +var tasks = new Task[C]; +for (int i = 0; i < C; i++) +{ + tasks[i] = Requests(cts.Token); +} + +cts.CancelAfter(time); +Console.WriteLine("Start waiting"); +await Task.WhenAll(tasks); +Console.WriteLine("End waiting"); + +var totalRequests = tasks.Sum(i => i.Result); +Console.WriteLine($"Total requests: {totalRequests}"); +Console.WriteLine($"Results: {totalRequests / time.TotalSeconds:N} RPS"); + +async Task Requests(CancellationToken token) +{ + var builder = new FullMixBuilder(); + + builder.Modules.Add(new CborSerializationToolkit()); + builder.Modules.Add(new EndPointContext()); + builder.Modules.Add(new RemoteInstanceRepository()); + builder.Modules.Add(new ChannelInteractionModule()); + // builder.Modules.Add(new UdpUntrustedInteraction()); + builder.Modules.Add(new RepresentationModule()); + var serverEndPoint = new IPEndPoint(IPAddress.Loopback, 4567); + builder.Modules.Add(new NetworkFrontendBridge(serverEndPoint)); + builder.Modules.Add(new StaticRepresentationModuleProducer()); + // builder.Modules.Add(new RequestExtractor()); + builder.Modules.Add(new BasicExecutionModule()); + var methodRepo = new CollectableMethodRepository(); + methodRepo.AppendInvokers(new GeneratedInvokersCollection()); + builder.Modules.Add(methodRepo); + builder.Modules.Add(new GeneratedCallIndexProvider()); + builder.UseCollectableContextRepository(); + builder.Modules.Add(new CancellationRepository()); + + builder.Build(); + + var frontendBridge = builder.GetModule()!; + await frontendBridge.Connect(); + // _ = builder.GetModule()!.StartExtraction(); + // _ = builder.GetModule().Start(serverEndPoint); + var context = builder.GetModule(); + + var factory = + context.GetSingletonObject( + builder.GetModule()); + + int count = 0; + int a; + do + { + a = await factory.Next(2); + count++; + } while (!token.IsCancellationRequested); + + Console.WriteLine(a); + return count; +} \ No newline at end of file diff --git a/mROA.Cbor/CborSerializationToolkit.cs b/mROA.Cbor/CborSerializationToolkit.cs index a17cd39..eacc5f3 100644 --- a/mROA.Cbor/CborSerializationToolkit.cs +++ b/mROA.Cbor/CborSerializationToolkit.cs @@ -15,12 +15,13 @@ namespace mROA.Cbor { private Dictionary> _propertiesCache = new(); public static TimeSpan SerializationTime = TimeSpan.Zero; + public byte[] Serialize(object objectToSerialize, IEndPointContext context) { var sw = Stopwatch.StartNew(); - var writer = new CborWriter(); + var writer = new CborWriter(initialCapacity:64); WriteData(objectToSerialize, writer, context); - var result = writer.Encode(); + var result = writer.Encode(); sw.Stop(); SerializationTime = SerializationTime.Add(sw.Elapsed); return result; @@ -28,7 +29,7 @@ namespace mROA.Cbor public int Serialize(object objectToSerialize, Span destination, IEndPointContext context) { - var writer = new CborWriter(); + var writer = new CborWriter(initialCapacity:64); WriteData(objectToSerialize, writer, context); return writer.Encode(destination); } @@ -288,7 +289,6 @@ namespace mROA.Cbor return ReadDictionary(reader, type, context); } - if (type == typeof(DateTimeOffset)) return reader.ReadDateTimeOffset(); @@ -418,7 +418,8 @@ namespace mROA.Cbor property.SetValue(obj, value); } - reader.ReadEndArray(); + if (reader.PeekState() == CborReaderState.EndArray) + reader.ReadEndArray(); } catch (Exception e) { @@ -447,6 +448,7 @@ namespace mROA.Cbor { return properties; } + var propertiesList = FilterProperties(type.GetProperties()); _propertiesCache[type] = propertiesList; return propertiesList;