rewrite call request to structs. 300 000 rps performance

This commit is contained in:
2025-07-10 11:10:32 +03:00
parent a5a23354f9
commit 765625c65f
7 changed files with 24 additions and 19 deletions
+2 -2
View File
@@ -17,7 +17,7 @@ namespace mROA.Cbor
{ {
public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization) public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization)
{ {
var v = (NetworkMessageHeader)value; var v = value as NetworkMessageHeader;
writer.WriteStartArray(3); writer.WriteStartArray(3);
writer.WriteByteString(v.Id.ToByteArray()); writer.WriteByteString(v.Id.ToByteArray());
writer.WriteInt32((int)v.MessageType); writer.WriteInt32((int)v.MessageType);
@@ -42,7 +42,7 @@ namespace mROA.Cbor
{ {
public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization) public void Write(CborWriter writer, object value, IEndPointContext context, CborSerializationToolkit serialization)
{ {
var v = value as DefaultCallRequest; var v = (DefaultCallRequest)value;
writer.WriteStartArray(4); writer.WriteStartArray(4);
writer.WriteByteString(v.Id.ToByteArray()); writer.WriteByteString(v.Id.ToByteArray());
writer.WriteInt32(v.CommandId); writer.WriteInt32(v.CommandId);
+1
View File
@@ -31,6 +31,7 @@ namespace mROA.Codegen
Console.WriteLine("Sending event..."); Console.WriteLine("Sending event...");
var request = new DefaultCallRequest var request = new DefaultCallRequest
{ {
Id = Guid.NewGuid(),
CommandId = <!L commandId>, CommandId = <!L commandId>,
ObjectId = new ComplexObjectIdentifier(index, ownerId), ObjectId = new ComplexObjectIdentifier(index, ownerId),
Parameters = new object[] { <!L transferParameters> } Parameters = new object[] { <!L transferParameters> }
+3 -3
View File
@@ -13,11 +13,11 @@ namespace mROA.Implementation
object?[]? Parameters { get; } object?[]? Parameters { get; }
} }
public class DefaultCallRequest : ICallRequest public struct DefaultCallRequest : ICallRequest
{ {
public Guid Id { get; set; } = Guid.NewGuid(); public Guid Id { get; set; }
public int CommandId { get; set; } public int CommandId { get; set; }
public ComplexObjectIdentifier ObjectId { get; set; } = ComplexObjectIdentifier.Null; public ComplexObjectIdentifier ObjectId { get; set; }
public object?[]? Parameters { get; set; } public object?[]? Parameters { get; set; }
@@ -127,7 +127,7 @@ namespace mROA.Implementation
} }
else else
{ {
await _trustedWriter.WriteAsync(new NetworkMessageHeader(){Data = Array.Empty<byte>()}); await _trustedWriter.WriteAsync(new NetworkMessageHeader());
} }
PassReconnection(); PassReconnection();
@@ -64,12 +64,12 @@ namespace mROA.Implementation.Frontend
switch (command.originalType) switch (command.originalType)
{ {
case EMessageType.CallRequest: case EMessageType.CallRequest:
HandleCallRequest((command.parced as DefaultCallRequest)!); HandleCallRequest((DefaultCallRequest)command.parced);
break; break;
case EMessageType.ClientDisconnect: case EMessageType.ClientDisconnect:
return; return;
case EMessageType.EventRequest: case EMessageType.EventRequest:
HandleEventRequest((command.parced as DefaultCallRequest)!); HandleEventRequest((DefaultCallRequest)command.parced);
break; break;
case EMessageType.CancelRequest: case EMessageType.CancelRequest:
HandleCancelRequest((command.parced as CancelRequest)!); HandleCancelRequest((command.parced as CancelRequest)!);
+5 -5
View File
@@ -5,7 +5,7 @@ using mROA.Abstract;
namespace mROA.Implementation namespace mROA.Implementation
{ {
public struct NetworkMessageHeader public class NetworkMessageHeader
{ {
private bool Equals(NetworkMessageHeader other) private bool Equals(NetworkMessageHeader other)
{ {
@@ -21,10 +21,10 @@ namespace mROA.Implementation
} }
public static readonly NetworkMessageHeader Null = new(); public static readonly NetworkMessageHeader Null = new();
// public NetworkMessageHeader() public NetworkMessageHeader()
// { {
// Data = Array.Empty<byte>(); Data = Array.Empty<byte>();
// } }
public NetworkMessageHeader(IContextualSerializationToolKit serializationToolkit, public NetworkMessageHeader(IContextualSerializationToolKit serializationToolkit,
INetworkMessage networkMessage, IEndPointContext? context) INetworkMessage networkMessage, IEndPointContext? context)
{ {
+10 -6
View File
@@ -33,7 +33,9 @@ namespace mROA.Implementation
private readonly ComplexObjectIdentifier _identifier; private readonly ComplexObjectIdentifier _identifier;
private readonly IRepresentationModule _representationModule; private readonly IRepresentationModule _representationModule;
protected readonly int[] _callIndices; protected readonly int[] _callIndices;
protected RemoteObjectBase(int id, IRepresentationModule representationModule, IEndPointContext context, int[] indices)
protected RemoteObjectBase(int id, IRepresentationModule representationModule, IEndPointContext context,
int[] indices)
{ {
_identifier = new ComplexObjectIdentifier { ContextId = id, OwnerId = representationModule.Id }; _identifier = new ComplexObjectIdentifier { ContextId = id, OwnerId = representationModule.Id };
_representationModule = representationModule; _representationModule = representationModule;
@@ -57,7 +59,7 @@ namespace mROA.Implementation
{ {
var request = new DefaultCallRequest var request = new DefaultCallRequest
{ {
CommandId = methodId, ObjectId = _identifier, Parameters = parameters Id = Guid.NewGuid(), CommandId = methodId, ObjectId = _identifier, Parameters = parameters
}; };
await _representationModule.PostCallMessageAsync(request.Id, EMessageType.CallRequest, request, _context); await _representationModule.PostCallMessageAsync(request.Id, EMessageType.CallRequest, request, _context);
@@ -65,7 +67,8 @@ namespace mROA.Implementation
var localTokenSource = new CancellationTokenSource(); var localTokenSource = new CancellationTokenSource();
var responseRequestTask = _representationModule.GetSingle( var responseRequestTask = _representationModule.GetSingle(
m => m.MessageType is EMessageType.FinishedCommandExecution or EMessageType.ExceptionCommandExecution, _context, m => m.MessageType is EMessageType.FinishedCommandExecution or EMessageType.ExceptionCommandExecution,
_context,
localTokenSource.Token, localTokenSource.Token,
m => m.MessageType is EMessageType.FinishedCommandExecution ? typeof(FinalCommandExecution<T>) : null, m => m.MessageType is EMessageType.FinishedCommandExecution ? typeof(FinalCommandExecution<T>) : null,
m => m.MessageType is EMessageType.ExceptionCommandExecution m => m.MessageType is EMessageType.ExceptionCommandExecution
@@ -101,14 +104,15 @@ namespace mROA.Implementation
{ {
var request = new DefaultCallRequest var request = new DefaultCallRequest
{ {
CommandId = methodId, ObjectId = _identifier, Parameters = parameters Id = Guid.NewGuid(), CommandId = methodId, ObjectId = _identifier, Parameters = parameters
}; };
await _representationModule.PostCallMessageAsync(request.Id, EMessageType.CallRequest, request, _context); await _representationModule.PostCallMessageAsync(request.Id, EMessageType.CallRequest, request, _context);
var localTokenSource = new CancellationTokenSource(); var localTokenSource = new CancellationTokenSource();
var responseRequestTask = _representationModule.GetSingle( var responseRequestTask = _representationModule.GetSingle(
m => m.MessageType is EMessageType.FinishedCommandExecution or EMessageType.ExceptionCommandExecution, _context, m => m.MessageType is EMessageType.FinishedCommandExecution or EMessageType.ExceptionCommandExecution,
_context,
localTokenSource.Token, localTokenSource.Token,
m => m.MessageType is EMessageType.FinishedCommandExecution ? typeof(FinalCommandExecution) : null, m => m.MessageType is EMessageType.FinishedCommandExecution ? typeof(FinalCommandExecution) : null,
m => m.MessageType is EMessageType.ExceptionCommandExecution m => m.MessageType is EMessageType.ExceptionCommandExecution
@@ -145,7 +149,7 @@ namespace mROA.Implementation
{ {
var request = new DefaultCallRequest var request = new DefaultCallRequest
{ {
CommandId = methodId, ObjectId = _identifier, Parameters = parameters Id = Guid.NewGuid(), CommandId = methodId, ObjectId = _identifier, Parameters = parameters
}; };
await _representationModule.PostCallMessageUntrustedAsync(request.Id, EMessageType.CallRequest, request, await _representationModule.PostCallMessageUntrustedAsync(request.Id, EMessageType.CallRequest, request,
_context); _context);