Faster cbor serialization with caching

This commit is contained in:
2025-07-03 18:13:02 +03:00
parent b27dfa0b0a
commit faf73e7798
10 changed files with 41 additions and 16 deletions
+1 -1
View File
@@ -14,7 +14,7 @@
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DefineConstants></DefineConstants>
<DefineConstants>JUST_LOAD</DefineConstants>
</PropertyGroup>
<ItemGroup>
+2 -3
View File
@@ -131,7 +131,7 @@ class Program
DemoCheck.TaskCancelation = true;
#endif
const int iterations = 10;
const int iterations = 10000;
var timer = Stopwatch.StartNew();
var x = 0;
for (int i = 0; i < iterations; i++)
@@ -147,7 +147,6 @@ class Program
frontendBridge.Disconnect();
DemoCheck.Show();
Console.ReadKey();
// DemoCheck.Show();
}
}
+14 -4
View File
@@ -13,6 +13,7 @@ namespace mROA.Cbor
{
public class CborSerializationToolkit : IContextualSerializationToolKit
{
private static Dictionary<Type, List<PropertyInfo>> _propertiesCache = new();
public static TimeSpan SerializationTime = TimeSpan.Zero;
public byte[] Serialize(object objectToSerialize, IEndPointContext context)
{
@@ -231,7 +232,7 @@ namespace mROA.Cbor
return;
}
var properties = FilterProperties(type.GetProperties());
var properties = GetAvalibleProperties(type);
var values = properties.Select(property => property.GetValue(obj)).ToList();
WriteList(values, writer, context);
}
@@ -402,9 +403,7 @@ namespace mROA.Cbor
private void FillObject(object obj, Type type, CborReader reader, IEndPointContext? context)
{
var propertyInfos = type.GetProperties();
var properties = FilterProperties(propertyInfos);
var properties = GetAvalibleProperties(type);
var length = reader.ReadStartArray();
try
{
@@ -441,5 +440,16 @@ namespace mROA.Cbor
return finalProperties;
}
private List<PropertyInfo> GetAvalibleProperties(Type type)
{
if (_propertiesCache.TryGetValue(type, out var properties))
{
return properties;
}
var propertiesList = FilterProperties(type.GetProperties());
_propertiesCache[type] = propertiesList;
return propertiesList;
}
}
}
+9 -1
View File
@@ -4,8 +4,9 @@
<TargetFramework>netstandard2.1</TargetFramework>
<Nullable>enable</Nullable>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>2.0.4</Version>
<Version>2.0.5</Version>
<LangVersion>9</LangVersion>
<PackageIcon>mroaLogo.png</PackageIcon>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
@@ -24,4 +25,11 @@
<PackageReference Include="System.Formats.Cbor" Version="9.0.2" />
</ItemGroup>
<ItemGroup>
<None Update="mroaLogo.png">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
</ItemGroup>
</Project>
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

+6 -1
View File
@@ -17,7 +17,8 @@
<RepositoryUrl>https://github.com/YaslePoy/mROA</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<Version>2.0.5</Version>
<Version>2.0.6</Version>
<PackageIcon>mroaLogo.png</PackageIcon>
</PropertyGroup>
<ItemGroup>
@@ -30,6 +31,10 @@
<ItemGroup>
<None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
<None Update="mroaLogo.png">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
</ItemGroup>
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

@@ -192,13 +192,10 @@ namespace mROA.Implementation
public async Task SingleReceive(CancellationToken token = default)
{
Console.WriteLine($"Receive start. Time: {profiler.ElapsedMilliseconds}ms");
var len = await ReadMessageLength();
Console.WriteLine($"Received len {len}. Time: {profiler.ElapsedMilliseconds}ms");
var localSpan = _buffer[..len];
await _ioStream.ReadExactlyAsync(localSpan, cancellationToken: token);
Console.WriteLine($"Received. Time: {profiler.ElapsedMilliseconds}ms");
profiler.Restart();
var message = _serializationToolkit.Deserialize<NetworkMessageHeader>(localSpan, _context);
MessageReceived(message);
@@ -218,10 +215,8 @@ namespace mROA.Implementation
var len = _serializationToolkit.Serialize(message, bodySpan.Span, _context);
var header = BitConverter.GetBytes((ushort)len);
header.CopyTo(_buffer);
Console.WriteLine($"Send start. Time: {profiler.ElapsedMilliseconds}ms");
var sendingSpan = _buffer[..(len + 2)];
await _ioStream.WriteAsync(sendingSpan, token);
Console.WriteLine($"Send. Time: {profiler.ElapsedMilliseconds}ms");
profiler.Restart();
}
+9 -1
View File
@@ -4,7 +4,7 @@
<TargetFramework>netstandard2.1</TargetFramework>
<Nullable>enable</Nullable>
<Title>mROA</Title>
<Version>2.0.6</Version>
<Version>2.0.7</Version>
<Authors>YaslePoy</Authors>
<Description>Fast and easy RPC with contex</Description>
<RepositoryUrl>https://github.com/YaslePoy/mROA</RepositoryUrl>
@@ -14,6 +14,7 @@
<LangVersion>9</LangVersion>
<Configurations>Debug;Release</Configurations>
<Platforms>AnyCPU</Platforms>
<PackageIcon>mroaLogo.png</PackageIcon>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
@@ -29,4 +30,11 @@
<PackageReference Include="System.Threading.Channels" Version="9.0.5" />
</ItemGroup>
<ItemGroup>
<None Update="mroaLogo.png">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
</ItemGroup>
</Project>
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB