From 1fa979c0f6a9f2e1925654da51da8d2d70a3357e Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Sun, 25 Apr 2021 22:00:31 +0200 Subject: [PATCH] Add serialization manager shutdown method and initialize benchmark (#1728) --- .../SerializationInitializeBenchmark.cs | 21 +++++++++ .../Read/SerializationReadBenchmark.cs | 34 ++------------- .../Serialization/SerializationBenchmark.cs | 43 +++++++++++++++++++ .../Manager/ISerializationManager.cs | 5 +++ .../Manager/SerializationManager.cs | 24 +++++++++++ 5 files changed, 96 insertions(+), 31 deletions(-) create mode 100644 Robust.Benchmarks/Serialization/Initialize/SerializationInitializeBenchmark.cs create mode 100644 Robust.Benchmarks/Serialization/SerializationBenchmark.cs diff --git a/Robust.Benchmarks/Serialization/Initialize/SerializationInitializeBenchmark.cs b/Robust.Benchmarks/Serialization/Initialize/SerializationInitializeBenchmark.cs new file mode 100644 index 0000000000..8a476f331c --- /dev/null +++ b/Robust.Benchmarks/Serialization/Initialize/SerializationInitializeBenchmark.cs @@ -0,0 +1,21 @@ +using BenchmarkDotNet.Attributes; +using Robust.Shared.Serialization.Manager; + +namespace Robust.Benchmarks.Serialization.Initialize +{ + public class SerializationInitializeBenchmark : SerializationBenchmark + { + [IterationCleanup] + public void IterationCleanup() + { + SerializationManager.Shutdown(); + } + + [Benchmark] + public ISerializationManager Initialize() + { + InitializeSerialization(); + return SerializationManager; + } + } +} diff --git a/Robust.Benchmarks/Serialization/Read/SerializationReadBenchmark.cs b/Robust.Benchmarks/Serialization/Read/SerializationReadBenchmark.cs index 5503fd5353..327711a3e0 100644 --- a/Robust.Benchmarks/Serialization/Read/SerializationReadBenchmark.cs +++ b/Robust.Benchmarks/Serialization/Read/SerializationReadBenchmark.cs @@ -1,41 +1,15 @@ -using System; -using System.IO; +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 class SerializationReadBenchmark : SerializationBenchmark { 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().LoadCVarsFromAssembly(assembly); - } - - IoCManager.Resolve().LoadAssemblies(assemblies); - - SerializationManager = IoCManager.Resolve(); - SerializationManager.Initialize(); + InitializeSerialization(); StringDataDefNode = new MappingDataNode(); StringDataDefNode.AddNode(new ValueDataNode("string"), new ValueDataNode("ABC")); @@ -46,8 +20,6 @@ namespace Robust.Benchmarks.Serialization.Read SeedNode = yamlStream.Documents[0].RootNode.ToDataNodeCast().Cast(0); } - private ISerializationManager SerializationManager { get; } - private ValueDataNode StringNode { get; } = new("ABC"); private ValueDataNode IntNode { get; } = new("1"); diff --git a/Robust.Benchmarks/Serialization/SerializationBenchmark.cs b/Robust.Benchmarks/Serialization/SerializationBenchmark.cs new file mode 100644 index 0000000000..93470f6532 --- /dev/null +++ b/Robust.Benchmarks/Serialization/SerializationBenchmark.cs @@ -0,0 +1,43 @@ +using System; +using Robust.Server; +using Robust.Shared.Configuration; +using Robust.Shared.ContentPack; +using Robust.Shared.IoC; +using Robust.Shared.Reflection; +using Robust.Shared.Serialization.Manager; + +namespace Robust.Benchmarks.Serialization +{ + public abstract class SerializationBenchmark + { + public SerializationBenchmark() + { + 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().LoadCVarsFromAssembly(assembly); + } + + IoCManager.Resolve().LoadAssemblies(assemblies); + + SerializationManager = IoCManager.Resolve(); + } + + protected ISerializationManager SerializationManager { get; } + + public void InitializeSerialization() + { + SerializationManager.Initialize(); + } + } +} diff --git a/Robust.Shared/Serialization/Manager/ISerializationManager.cs b/Robust.Shared/Serialization/Manager/ISerializationManager.cs index 7416220e5b..9b961d5be4 100644 --- a/Robust.Shared/Serialization/Manager/ISerializationManager.cs +++ b/Robust.Shared/Serialization/Manager/ISerializationManager.cs @@ -14,6 +14,11 @@ namespace Robust.Shared.Serialization.Manager /// void Initialize(); + /// + /// Shuts down the serialization manager. + /// + void Shutdown(); + /// /// Checks if a type has a data definition defined for it. /// diff --git a/Robust.Shared/Serialization/Manager/SerializationManager.cs b/Robust.Shared/Serialization/Manager/SerializationManager.cs index 71efbc6b71..86f03a0e87 100644 --- a/Robust.Shared/Serialization/Manager/SerializationManager.cs +++ b/Robust.Shared/Serialization/Manager/SerializationManager.cs @@ -114,6 +114,30 @@ namespace Robust.Shared.Serialization.Manager _initializing = false; } + public void Shutdown() + { + DependencyCollection = null!; + + _constantsMapping.Clear(); + _flagsMapping.Clear(); + + _genericWriterTypes.Clear(); + _genericReaderTypes.Clear(); + _genericCopierTypes.Clear(); + _genericValidatorTypes.Clear(); + + _typeWriters.Clear(); + _typeReaders.Clear(); + _typeCopiers.Clear(); + _typeValidators.Clear(); + + _dataDefinitions.Clear(); + + _copyByRefRegistrations.Clear(); + + _initialized = false; + } + public bool HasDataDefinition(Type type) { if (type.IsGenericTypeDefinition) throw new NotImplementedException($"Cannot yet check data definitions for generic types. ({type})");