From 0685c293f95ea9a6f3e9c46d43e12b75139992de Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Mon, 11 May 2020 13:57:06 -0500 Subject: [PATCH 1/2] Add JSON benchmarks for missing and case-insensitive --- .../ReadMissingAndCaseInsensitive.cs | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/benchmarks/micro/libraries/System.Text.Json/Serializer/ReadMissingAndCaseInsensitive.cs diff --git a/src/benchmarks/micro/libraries/System.Text.Json/Serializer/ReadMissingAndCaseInsensitive.cs b/src/benchmarks/micro/libraries/System.Text.Json/Serializer/ReadMissingAndCaseInsensitive.cs new file mode 100644 index 00000000000..40f0460ea0d --- /dev/null +++ b/src/benchmarks/micro/libraries/System.Text.Json/Serializer/ReadMissingAndCaseInsensitive.cs @@ -0,0 +1,57 @@ +// 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.Serialization; + +namespace System.Text.Json.Serialization.Tests +{ + [GenericTypeArguments(typeof(Location))] + public class ReadMissingAndCaseInsensitive + { + private string _serialized; + private string _serializedCamelCased; + private JsonSerializerOptions _optionsBaseline; + private JsonSerializerOptions _optionsCaseInsensitive; + + [GlobalSetup] + public void Setup() + { + T value = DataGenerator.Generate(); + _serialized = JsonSerializer.Serialize(value); + + JsonSerializerOptions options = new JsonSerializerOptions() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + _serializedCamelCased = JsonSerializer.Serialize(value, options); + + _optionsBaseline = new JsonSerializerOptions(); + + _optionsCaseInsensitive = new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }; + } + + [BenchmarkCategory(Categories.Libraries, Categories.JSON)] + [Benchmark] + public T DeserializeBaseline() => JsonSerializer.Deserialize(_serialized, _optionsBaseline); + + [BenchmarkCategory(Categories.Libraries, Categories.JSON)] + [Benchmark] + public T DeserializeMissing() => JsonSerializer.Deserialize(_serializedCamelCased, _optionsBaseline); + + [BenchmarkCategory(Categories.Libraries, Categories.JSON)] + [Benchmark] + public T DeserializeCaseMatching() => JsonSerializer.Deserialize(_serialized, _optionsCaseInsensitive); + + [BenchmarkCategory(Categories.Libraries, Categories.JSON)] + [Benchmark] + public T DeserializeCaseNotMatching() => JsonSerializer.Deserialize(_serializedCamelCased, _optionsCaseInsensitive); + } +} From 527df4772980960e0228d0a7d4d24c5b55d7a0ae Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Mon, 11 May 2020 16:12:40 -0500 Subject: [PATCH 2/2] Rename tests --- .../ReadMissingAndCaseInsensitive.cs | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/benchmarks/micro/libraries/System.Text.Json/Serializer/ReadMissingAndCaseInsensitive.cs b/src/benchmarks/micro/libraries/System.Text.Json/Serializer/ReadMissingAndCaseInsensitive.cs index 40f0460ea0d..001283861fe 100644 --- a/src/benchmarks/micro/libraries/System.Text.Json/Serializer/ReadMissingAndCaseInsensitive.cs +++ b/src/benchmarks/micro/libraries/System.Text.Json/Serializer/ReadMissingAndCaseInsensitive.cs @@ -38,20 +38,34 @@ public void Setup() }; } + /// + /// Uses default settings of case-sensitive comparison and JSON that matches the Pascal-casing + /// of the properties on the class. + /// [BenchmarkCategory(Categories.Libraries, Categories.JSON)] [Benchmark] - public T DeserializeBaseline() => JsonSerializer.Deserialize(_serialized, _optionsBaseline); + public T Baseline() => JsonSerializer.Deserialize(_serialized, _optionsBaseline); + /// + /// Properties are missing because the comparison is case-sensitive and the JSON uses camel-casing + /// which does not match the properties on the class. + /// [BenchmarkCategory(Categories.Libraries, Categories.JSON)] [Benchmark] - public T DeserializeMissing() => JsonSerializer.Deserialize(_serializedCamelCased, _optionsBaseline); + public T MissingProperties() => JsonSerializer.Deserialize(_serializedCamelCased, _optionsBaseline); + /// + /// Case-insensitive is enabled and the casing in JSON matches the properties on the class. + /// [BenchmarkCategory(Categories.Libraries, Categories.JSON)] [Benchmark] - public T DeserializeCaseMatching() => JsonSerializer.Deserialize(_serialized, _optionsCaseInsensitive); + public T CaseInsensitiveMatching() => JsonSerializer.Deserialize(_serialized, _optionsCaseInsensitive); + /// + /// Case-insensitive is enabled and the casing in JSON does not match the properties on the class. + /// [BenchmarkCategory(Categories.Libraries, Categories.JSON)] [Benchmark] - public T DeserializeCaseNotMatching() => JsonSerializer.Deserialize(_serializedCamelCased, _optionsCaseInsensitive); + public T CaseInsensitiveNotMatching() => JsonSerializer.Deserialize(_serializedCamelCased, _optionsCaseInsensitive); } }