mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-02-15 03:30:53 +01:00
* Add Robust.Benchmarks and read string benchmark
* Separate serialization manager methods, use compiled lambdas to call manager read
4 us > 200 ns
* Add int and data definition with string benchmarks
* Make serialization population use expressions to create definitions
* Make benchmark classes internal and create seed data definition
* Add complex data definition read benchmark
* Create primitive serializers, remove primitive special case
| Method | Mean | Error | StdDev |
|----------------------- |------------:|----------:|----------:|
| ReadString | 227.1 ns | 4.47 ns | 5.65 ns |
| ReadInteger | 245.4 ns | 4.82 ns | 6.26 ns |
| ReadDataDefWithString | 804.7 ns | 15.27 ns | 16.34 ns |
| ReadSeedDataDefinition | 15,846.8 ns | 312.89 ns | 773.39 ns |
* Remove testing code
* Setup delegates during initialize
* Revert "Setup delegates during initialize"
This reverts commit 7ff4d4eaaa.
* Store delegates in a concurrent dictionary because I really cannot be arsed to generate them on initialize at this point
84 lines
2.6 KiB
C#
84 lines
2.6 KiB
C#
using System;
|
|
using System.IO;
|
|
using BenchmarkDotNet.Attributes;
|
|
using Robust.Server;
|
|
using Robust.Shared.Configuration;
|
|
using Robust.Shared.ContentPack;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Reflection;
|
|
using Robust.Shared.Serialization.Manager;
|
|
using Robust.Shared.Serialization.Markdown;
|
|
using YamlDotNet.RepresentationModel;
|
|
|
|
namespace Robust.Benchmarks.Serialization.Read
|
|
{
|
|
public class SerializationReadBenchmark
|
|
{
|
|
public SerializationReadBenchmark()
|
|
{
|
|
IoCManager.InitThread();
|
|
ServerIoC.RegisterIoC();
|
|
IoCManager.BuildGraph();
|
|
|
|
var assemblies = new[]
|
|
{
|
|
AppDomain.CurrentDomain.GetAssemblyByName("Robust.Shared"),
|
|
AppDomain.CurrentDomain.GetAssemblyByName("Robust.Server"),
|
|
AppDomain.CurrentDomain.GetAssemblyByName("Robust.Benchmarks")
|
|
};
|
|
|
|
foreach (var assembly in assemblies)
|
|
{
|
|
IoCManager.Resolve<IConfigurationManagerInternal>().LoadCVarsFromAssembly(assembly);
|
|
}
|
|
|
|
IoCManager.Resolve<IReflectionManager>().LoadAssemblies(assemblies);
|
|
|
|
SerializationManager = IoCManager.Resolve<ISerializationManager>();
|
|
SerializationManager.Initialize();
|
|
|
|
StringDataDefNode = new MappingDataNode();
|
|
StringDataDefNode.AddNode(new ValueDataNode("string"), new ValueDataNode("ABC"));
|
|
|
|
var yamlStream = new YamlStream();
|
|
yamlStream.Load(new StringReader(SeedDataDefinition.Prototype));
|
|
|
|
SeedNode = yamlStream.Documents[0].RootNode.ToDataNodeCast<SequenceDataNode>().Cast<MappingDataNode>(0);
|
|
}
|
|
|
|
private ISerializationManager SerializationManager { get; }
|
|
|
|
private ValueDataNode StringNode { get; } = new("ABC");
|
|
|
|
private ValueDataNode IntNode { get; } = new("1");
|
|
|
|
private MappingDataNode StringDataDefNode { get; }
|
|
|
|
private MappingDataNode SeedNode { get; }
|
|
|
|
[Benchmark]
|
|
public string? ReadString()
|
|
{
|
|
return SerializationManager.ReadValue<string>(StringNode);
|
|
}
|
|
|
|
[Benchmark]
|
|
public int? ReadInteger()
|
|
{
|
|
return SerializationManager.ReadValue<int>(IntNode);
|
|
}
|
|
|
|
[Benchmark]
|
|
public DataDefinitionWithString? ReadDataDefinitionWithString()
|
|
{
|
|
return SerializationManager.ReadValue<DataDefinitionWithString>(StringDataDefNode);
|
|
}
|
|
|
|
[Benchmark]
|
|
public SeedDataDefinition? ReadSeedDataDefinition()
|
|
{
|
|
return SerializationManager.ReadValue<SeedDataDefinition>(SeedNode);
|
|
}
|
|
}
|
|
}
|