diff --git a/src/benchmarks/micro/MicroBenchmarks.csproj b/src/benchmarks/micro/MicroBenchmarks.csproj index a3135389587..9a759090917 100644 --- a/src/benchmarks/micro/MicroBenchmarks.csproj +++ b/src/benchmarks/micro/MicroBenchmarks.csproj @@ -87,6 +87,11 @@ + + + + + diff --git a/src/benchmarks/micro/Serializers/DataGenerator.cs b/src/benchmarks/micro/Serializers/DataGenerator.cs index e49f9c28784..33bf8adb1e2 100644 --- a/src/benchmarks/micro/Serializers/DataGenerator.cs +++ b/src/benchmarks/micro/Serializers/DataGenerator.cs @@ -35,6 +35,8 @@ internal static T Generate() return (T)(object)CreateXmlElement(); if (typeof(T) == typeof(SimpleStructWithProperties)) return (T)(object)new SimpleStructWithProperties { Num = 1, Text = "Foo" }; + if (typeof(T) == typeof(SimpleListOfInt)) + return (T)(object)new SimpleListOfInt { 10, 20, 30 }; if (typeof(T) == typeof(ClassImplementingIXmlSerialiable)) return (T)(object)new ClassImplementingIXmlSerialiable { StringValue = "Hello world" }; if (typeof(T) == typeof(Dictionary)) @@ -361,6 +363,8 @@ public struct SimpleStructWithProperties public int Num { get; set; } public string Text { get; set; } } + + public class SimpleListOfInt : List { } public class ClassImplementingIXmlSerialiable : IXmlSerializable { diff --git a/src/benchmarks/micro/libraries/System.Text.Json/Serializer/ReadPreservedReferences.cs b/src/benchmarks/micro/libraries/System.Text.Json/Serializer/ReadPreservedReferences.cs new file mode 100644 index 00000000000..6c532d75fce --- /dev/null +++ b/src/benchmarks/micro/libraries/System.Text.Json/Serializer/ReadPreservedReferences.cs @@ -0,0 +1,55 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using BenchmarkDotNet.Attributes; +using MicroBenchmarks; +using MicroBenchmarks.Serializers; +using Newtonsoft.Json; + +namespace System.Text.Json.Serialization.Tests +{ + [GenericTypeArguments(typeof(LoginViewModel))] + [GenericTypeArguments(typeof(Location))] + [GenericTypeArguments(typeof(IndexViewModel))] + [GenericTypeArguments(typeof(MyEventsListerViewModel))] + [GenericTypeArguments(typeof(SimpleListOfInt))] + [GenericTypeArguments(typeof(SimpleStructWithProperties))] + public class ReadPreservedReferences + { + [Params(false, true)] + public bool IsDataPreserved; + + private string _serialized; + private JsonSerializerOptions _options; + private JsonSerializerSettings _settings; + + [GlobalSetup] + public void Setup() + { + _options = new JsonSerializerOptions { ReferenceHandling = ReferenceHandling.Preserve }; + + _settings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.All }; + + T value = DataGenerator.Generate(); + + if (IsDataPreserved) + { + _serialized = JsonConvert.SerializeObject(value, _settings); + } + else + { + // Use payload that does not contain metadata in order to see what is the penalty of having ReferenceHandling.Preserve set. + _serialized = JsonConvert.SerializeObject(value); + } + } + + [BenchmarkCategory(Categories.Libraries, Categories.JSON)] + [Benchmark] + public T DeserializePreserved() => JsonSerializer.Deserialize(_serialized, _options); + + [BenchmarkCategory(Categories.ThirdParty, Categories.JSON)] + [Benchmark(Baseline = true)] + public T NewtonsoftDeserializePreserved() => JsonConvert.DeserializeObject(_serialized, _settings); + } +} \ No newline at end of file diff --git a/src/benchmarks/micro/libraries/System.Text.Json/Serializer/WritePreservedReferences.cs b/src/benchmarks/micro/libraries/System.Text.Json/Serializer/WritePreservedReferences.cs new file mode 100644 index 00000000000..03815f8decc --- /dev/null +++ b/src/benchmarks/micro/libraries/System.Text.Json/Serializer/WritePreservedReferences.cs @@ -0,0 +1,42 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using BenchmarkDotNet.Attributes; +using MicroBenchmarks; +using MicroBenchmarks.Serializers; +using Newtonsoft.Json; + +namespace System.Text.Json.Serialization.Tests +{ + [GenericTypeArguments(typeof(LoginViewModel))] + [GenericTypeArguments(typeof(Location))] + [GenericTypeArguments(typeof(IndexViewModel))] + [GenericTypeArguments(typeof(MyEventsListerViewModel))] + [GenericTypeArguments(typeof(SimpleListOfInt))] + [GenericTypeArguments(typeof(SimpleStructWithProperties))] + public class WritePreservedReferences + { + private T _value; + private JsonSerializerOptions _options; + private JsonSerializerSettings _settings; + + [GlobalSetup] + public void Setup() + { + _value = DataGenerator.Generate(); + + _options = new JsonSerializerOptions { ReferenceHandling = ReferenceHandling.Preserve }; + + _settings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.All }; + } + + [BenchmarkCategory(Categories.Libraries, Categories.JSON)] + [Benchmark] + public string SerializePreserved() => JsonSerializer.Serialize(_value, _options); + + [BenchmarkCategory(Categories.ThirdParty, Categories.JSON)] + [Benchmark(Baseline = true)] + public string NewtonsoftSerializePreserved() => JsonConvert.SerializeObject(_value, _settings); + } +} \ No newline at end of file