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