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;