From 40d025bb570fb7497fa476b2d2ecd567cc848462 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 25 Sep 2024 16:24:57 +0100 Subject: [PATCH] use pool and more ValueTask --- .../SpeckleObjectDeserializer.cs | 30 ++++++++++++++----- .../Serialisation/SpeckleObjectSerializer.cs | 4 +-- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/Speckle.Sdk/Serialisation/SpeckleObjectDeserializer.cs b/src/Speckle.Sdk/Serialisation/SpeckleObjectDeserializer.cs index 2183d4d6..2098812f 100644 --- a/src/Speckle.Sdk/Serialisation/SpeckleObjectDeserializer.cs +++ b/src/Speckle.Sdk/Serialisation/SpeckleObjectDeserializer.cs @@ -16,7 +16,7 @@ public sealed class SpeckleObjectDeserializer private readonly object _callbackLock = new(); private readonly object?[] _invokeNull = [null]; - // id -> Base if already deserialized or id -> Task if was handled by a bg thread + // id -> Base if already deserialized or id -> ValueTask if was handled by a bg thread private ConcurrentDictionary? _deserializedObjects; /// @@ -45,7 +45,7 @@ public sealed class SpeckleObjectDeserializer /// was null /// cannot be deserialised to type // /// did not contain the required json objects (closures) - public async Task DeserializeAsync(string rootObjectJson) + public async ValueTask DeserializeAsync(string rootObjectJson) { if (_isBusy) { @@ -68,7 +68,7 @@ public sealed class SpeckleObjectDeserializer } } - private async Task DeserializeJsonAsyncInternal(string objectJson) + private async ValueTask DeserializeJsonAsyncInternal(string objectJson) { if (objectJson is null) { @@ -104,7 +104,7 @@ public sealed class SpeckleObjectDeserializer } //this should be buffered - private async Task> ReadArrayAsync(JsonReader reader, CancellationToken ct) + private async ValueTask> ReadArrayAsync(JsonReader reader, CancellationToken ct) { reader.Read(); List retList = new(); @@ -124,7 +124,7 @@ public sealed class SpeckleObjectDeserializer return retList; } - private async Task ReadObjectAsync(JsonReader reader, CancellationToken ct) + private async ValueTask ReadObjectAsync(JsonReader reader, CancellationToken ct) { reader.Read(); Dictionary dict = new(); @@ -180,7 +180,7 @@ public sealed class SpeckleObjectDeserializer return Dict2Base(dict); } - private async Task TryGetDeserializedAsync(string objId) + private async ValueTask TryGetDeserializedAsync(string objId) { object? deserialized = null; _deserializedObjects.NotNull(); @@ -205,6 +205,22 @@ public sealed class SpeckleObjectDeserializer _currentCount++; } } + if (deserialized is ValueTask valueTask) + { + try + { + deserialized = valueTask.Result; + } + catch (AggregateException ex) + { + throw new SpeckleDeserializeException("Failed to deserialize reference object", ex); + } + + if (_deserializedObjects.TryAdd(objId, deserialized)) + { + _currentCount++; + } + } if (deserialized != null) { return deserialized; @@ -227,7 +243,7 @@ public sealed class SpeckleObjectDeserializer return deserialized; } - private async Task ReadPropertyAsync(JsonReader reader, CancellationToken ct) + private async ValueTask ReadPropertyAsync(JsonReader reader, CancellationToken ct) { ct.ThrowIfCancellationRequested(); switch (reader.TokenType) diff --git a/src/Speckle.Sdk/Serialisation/SpeckleObjectSerializer.cs b/src/Speckle.Sdk/Serialisation/SpeckleObjectSerializer.cs index c3f04549..998ff450 100644 --- a/src/Speckle.Sdk/Serialisation/SpeckleObjectSerializer.cs +++ b/src/Speckle.Sdk/Serialisation/SpeckleObjectSerializer.cs @@ -251,7 +251,7 @@ public class SpeckleObjectSerializer } using var writer = new StringWriter(); - using var jsonWriter = new JsonTextWriter(writer); + using var jsonWriter = SpeckleObjectSerializerPool.Instance.GetJsonTextWriter(writer); string id = SerializeBaseObject(baseObj, jsonWriter, closure); var json = writer.ToString(); @@ -275,7 +275,7 @@ public class SpeckleObjectSerializer ObjectReference objRef = new() { referencedId = id }; using var writer2 = new StringWriter(); - using var jsonWriter2 = new JsonTextWriter(writer2); + using var jsonWriter2 = SpeckleObjectSerializerPool.Instance.GetJsonTextWriter(writer2); SerializeProperty(objRef, jsonWriter2); var json2 = writer2.ToString(); UpdateParentClosures(id);