From 48e4b13cf4b61b2070df5170e7c350d85b8cfc6f Mon Sep 17 00:00:00 2001 From: Youssef1313 Date: Mon, 13 Jul 2026 08:24:59 +0200 Subject: [PATCH 1/7] Differentiate unset value from null value in OpenApiSchema.Const --- src/Microsoft.OpenApi/Models/OpenApiSchema.cs | 8 +++---- .../Models/OpenApiUnsetValues.cs | 22 +++++++++++++++++++ src/Microsoft.OpenApi/PublicAPI.Unshipped.txt | 2 ++ .../Reader/JsonNodeHelper.cs | 2 +- .../Reader/V3/OpenApiV3Deserializer.cs | 2 +- .../Writers/OpenApiWriterExtensions.cs | 6 +++++ 6 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 src/Microsoft.OpenApi/Models/OpenApiUnsetValues.cs diff --git a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs index 4d41a6e0e..267f734e3 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiSchema.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiSchema.cs @@ -118,7 +118,7 @@ Extensions is not null && jsonNode.GetValueKind() is JsonValueKind.True; /// - public string? Const { get; set; } + public string? Const { get; set; } = OpenApiUnsetValues.UnsetString; /// public string? Format { get; set; } @@ -511,7 +511,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version // enum var enumValue = Enum is not { Count: > 0 } - && !string.IsNullOrEmpty(Const) + && !ReferenceEquals(Const, OpenApiUnsetValues.UnsetString) && version < OpenApiSpecVersion.OpenApi3_1 ? new List { JsonValue.Create(Const)! } : Enum; @@ -685,7 +685,7 @@ internal void WriteJsonSchemaKeywords(IOpenApiWriter writer, Action w.WriteValue(s)); writer.WriteOptionalMap(OpenApiConstants.Defs, Definitions, callback); writer.WriteProperty(OpenApiConstants.Anchor, Anchor); @@ -891,7 +891,7 @@ private void SerializeAsV2( }); // enum - var enumValue = Enum is not { Count: > 0 } && !string.IsNullOrEmpty(Const) + var enumValue = Enum is not { Count: > 0 } && !ReferenceEquals(Const, OpenApiUnsetValues.UnsetString) ? new List { JsonValue.Create(Const)! } : Enum; writer.WriteOptionalCollection(OpenApiConstants.Enum, enumValue, (nodeWriter, s) => nodeWriter.WriteAny(s)); diff --git a/src/Microsoft.OpenApi/Models/OpenApiUnsetValues.cs b/src/Microsoft.OpenApi/Models/OpenApiUnsetValues.cs new file mode 100644 index 000000000..661bf51fc --- /dev/null +++ b/src/Microsoft.OpenApi/Models/OpenApiUnsetValues.cs @@ -0,0 +1,22 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System; + +namespace Microsoft.OpenApi; + +/// +/// Some OpenAPI properties allow 'null' as a valid value, which is different from omitting the +/// property completely. This class holds values that represent an unset value, so that serialization can +/// differentiate between a null value (serialized as null) and an unset value (not serialized at all). +/// +public static class OpenApiUnsetValues +{ + /// + /// Represents an unset string value. + /// Some OpenAPI string properties does allow 'null' as a valid value, which is different + /// from when the property is completely omitted. + /// This UnsetString differentiates that, and is used "by reference" in comparison. + /// + public static readonly string UnsetString = new string(Array.Empty()); +} diff --git a/src/Microsoft.OpenApi/PublicAPI.Unshipped.txt b/src/Microsoft.OpenApi/PublicAPI.Unshipped.txt index 7dc5c5811..fec442b86 100644 --- a/src/Microsoft.OpenApi/PublicAPI.Unshipped.txt +++ b/src/Microsoft.OpenApi/PublicAPI.Unshipped.txt @@ -1 +1,3 @@ #nullable enable +Microsoft.OpenApi.OpenApiUnsetValues +static readonly Microsoft.OpenApi.OpenApiUnsetValues.UnsetString -> string! diff --git a/src/Microsoft.OpenApi/Reader/JsonNodeHelper.cs b/src/Microsoft.OpenApi/Reader/JsonNodeHelper.cs index 3ccfb2116..85e2ed2ec 100644 --- a/src/Microsoft.OpenApi/Reader/JsonNodeHelper.cs +++ b/src/Microsoft.OpenApi/Reader/JsonNodeHelper.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs index ea499e098..e7ca30d39 100644 --- a/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System.Text.Json.Nodes; diff --git a/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs b/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs index f346dddc4..9aaa46795 100644 --- a/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs +++ b/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs @@ -41,6 +41,12 @@ public static void WriteProperty(this IOpenApiWriter writer, string name, string public static void WriteRequiredProperty(this IOpenApiWriter writer, string name, string? value) { Utils.CheckArgumentNullOrEmpty(name); + + if (ReferenceEquals(value, OpenApiUnsetValues.UnsetString)) + { + return; + } + writer.WritePropertyName(name); if (value == null) { From aa8b4001fbb341741cf8484d3b1cf448e9b14a83 Mon Sep 17 00:00:00 2001 From: Youssef1313 Date: Mon, 13 Jul 2026 10:45:24 +0200 Subject: [PATCH 2/7] Fix for ref --- src/Microsoft.OpenApi/Models/JsonSchemaReference.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Models/JsonSchemaReference.cs b/src/Microsoft.OpenApi/Models/JsonSchemaReference.cs index ccb62435b..e66809aaa 100644 --- a/src/Microsoft.OpenApi/Models/JsonSchemaReference.cs +++ b/src/Microsoft.OpenApi/Models/JsonSchemaReference.cs @@ -436,7 +436,7 @@ private void SerializeAdditionalV3XProperties(IOpenApiWriter writer, Action Date: Mon, 13 Jul 2026 10:51:15 +0200 Subject: [PATCH 3/7] Fix default for --- src/Microsoft.OpenApi/Models/JsonSchemaReference.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Models/JsonSchemaReference.cs b/src/Microsoft.OpenApi/Models/JsonSchemaReference.cs index e66809aaa..1132424d7 100644 --- a/src/Microsoft.OpenApi/Models/JsonSchemaReference.cs +++ b/src/Microsoft.OpenApi/Models/JsonSchemaReference.cs @@ -117,7 +117,7 @@ public class JsonSchemaReference : OpenApiReferenceWithDescription /// /// Follow JSON Schema definition. /// - public string? Const { get; set; } + public string? Const { get; set; } = OpenApiUnsetValues.UnsetString; /// /// Follow JSON Schema definition. From f14303451ace7caabc58d069e5dd75bed875b8f8 Mon Sep 17 00:00:00 2001 From: Youssef1313 Date: Tue, 14 Jul 2026 09:22:35 +0200 Subject: [PATCH 4/7] Different approach --- .../Models/JsonSchemaReference.cs | 22 ++++++++++-- src/Microsoft.OpenApi/Models/OpenApiSchema.cs | 34 ++++++++++++++++--- .../Models/OpenApiUnsetValues.cs | 22 ------------ .../References/OpenApiSchemaReference.cs | 2 +- src/Microsoft.OpenApi/PublicAPI.Unshipped.txt | 2 -- .../Writers/OpenApiWriterExtensions.cs | 5 --- 6 files changed, 51 insertions(+), 36 deletions(-) delete mode 100644 src/Microsoft.OpenApi/Models/OpenApiUnsetValues.cs diff --git a/src/Microsoft.OpenApi/Models/JsonSchemaReference.cs b/src/Microsoft.OpenApi/Models/JsonSchemaReference.cs index 1132424d7..e59df8ffa 100644 --- a/src/Microsoft.OpenApi/Models/JsonSchemaReference.cs +++ b/src/Microsoft.OpenApi/Models/JsonSchemaReference.cs @@ -114,10 +114,22 @@ public class JsonSchemaReference : OpenApiReferenceWithDescription /// public JsonSchemaType? SchemaType { get; set; } + internal bool WasConstExplicitlySet { get; private set; } + /// /// Follow JSON Schema definition. /// - public string? Const { get; set; } = OpenApiUnsetValues.UnsetString; + public string? Const + { + get => field; + set + { + // TODO: In the next major release, Const should be made a JsonNode. + // See https://github.com/microsoft/OpenAPI.NET/issues/2935 for more information. + WasConstExplicitlySet = true; + field = value; + } + } /// /// Follow JSON Schema definition. @@ -365,6 +377,7 @@ public JsonSchemaReference(JsonSchemaReference reference) : base(reference) ExclusiveMinimum = reference.ExclusiveMinimum; SchemaType = reference.SchemaType; Const = reference.Const; + WasConstExplicitlySet = reference.WasConstExplicitlySet; Format = reference.Format; Maximum = reference.Maximum; Minimum = reference.Minimum; @@ -436,7 +449,11 @@ private void SerializeAdditionalV3XProperties(IOpenApiWriter writer, Action - public string? Const { get; set; } = OpenApiUnsetValues.UnsetString; + public string? Const + { + get => field; + set + { + // TODO: In the next major release, Const should be made a JsonNode. + // See https://github.com/microsoft/OpenAPI.NET/issues/2935 for more information. + WasConstExplicitlySet = true; + field = value; + } + } /// public string? Format { get; set; } @@ -316,6 +328,15 @@ internal OpenApiSchema(IOpenApiSchema schema) Title = schema.Title ?? Title; Id = schema.Id ?? Id; Const = schema.Const ?? Const; + if (schema is OpenApiSchema concreteSchema) + { + WasConstExplicitlySet = concreteSchema.WasConstExplicitlySet; + } + else if (Const is null) + { + WasConstExplicitlySet = false; + } + Schema = schema.Schema ?? Schema; Comment = schema.Comment ?? Comment; Vocabulary = schema.Vocabulary != null ? new Dictionary(schema.Vocabulary) : null; @@ -511,7 +532,7 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version // enum var enumValue = Enum is not { Count: > 0 } - && !ReferenceEquals(Const, OpenApiUnsetValues.UnsetString) + && WasConstExplicitlySet && version < OpenApiSpecVersion.OpenApi3_1 ? new List { JsonValue.Create(Const)! } : Enum; @@ -685,7 +706,12 @@ internal void WriteJsonSchemaKeywords(IOpenApiWriter writer, Action w.WriteValue(s)); writer.WriteOptionalMap(OpenApiConstants.Defs, Definitions, callback); writer.WriteProperty(OpenApiConstants.Anchor, Anchor); @@ -891,7 +917,7 @@ private void SerializeAsV2( }); // enum - var enumValue = Enum is not { Count: > 0 } && !ReferenceEquals(Const, OpenApiUnsetValues.UnsetString) + var enumValue = Enum is not { Count: > 0 } && WasConstExplicitlySet ? new List { JsonValue.Create(Const)! } : Enum; writer.WriteOptionalCollection(OpenApiConstants.Enum, enumValue, (nodeWriter, s) => nodeWriter.WriteAny(s)); diff --git a/src/Microsoft.OpenApi/Models/OpenApiUnsetValues.cs b/src/Microsoft.OpenApi/Models/OpenApiUnsetValues.cs deleted file mode 100644 index 661bf51fc..000000000 --- a/src/Microsoft.OpenApi/Models/OpenApiUnsetValues.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -using System; - -namespace Microsoft.OpenApi; - -/// -/// Some OpenAPI properties allow 'null' as a valid value, which is different from omitting the -/// property completely. This class holds values that represent an unset value, so that serialization can -/// differentiate between a null value (serialized as null) and an unset value (not serialized at all). -/// -public static class OpenApiUnsetValues -{ - /// - /// Represents an unset string value. - /// Some OpenAPI string properties does allow 'null' as a valid value, which is different - /// from when the property is completely omitted. - /// This UnsetString differentiates that, and is used "by reference" in comparison. - /// - public static readonly string UnsetString = new string(Array.Empty()); -} diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs index 51187591c..49f51e355 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs @@ -71,7 +71,7 @@ public string? Title /// public JsonSchemaType? Type { get => Reference.SchemaType ?? Target?.Type; set => Reference.SchemaType = value; } /// - public string? Const { get => string.IsNullOrEmpty(Reference.Const) ? Target?.Const : Reference.Const; set => Reference.Const = value; } + public string? Const { get => Reference.WasConstExplicitlySet ? Reference.Const : Target?.Const; set => Reference.Const = value; } /// public string? Format { get => string.IsNullOrEmpty(Reference.Format) ? Target?.Format : Reference.Format; set => Reference.Format = value; } /// diff --git a/src/Microsoft.OpenApi/PublicAPI.Unshipped.txt b/src/Microsoft.OpenApi/PublicAPI.Unshipped.txt index fec442b86..7dc5c5811 100644 --- a/src/Microsoft.OpenApi/PublicAPI.Unshipped.txt +++ b/src/Microsoft.OpenApi/PublicAPI.Unshipped.txt @@ -1,3 +1 @@ #nullable enable -Microsoft.OpenApi.OpenApiUnsetValues -static readonly Microsoft.OpenApi.OpenApiUnsetValues.UnsetString -> string! diff --git a/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs b/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs index 9aaa46795..1d7a6e2a4 100644 --- a/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs +++ b/src/Microsoft.OpenApi/Writers/OpenApiWriterExtensions.cs @@ -42,11 +42,6 @@ public static void WriteRequiredProperty(this IOpenApiWriter writer, string name { Utils.CheckArgumentNullOrEmpty(name); - if (ReferenceEquals(value, OpenApiUnsetValues.UnsetString)) - { - return; - } - writer.WritePropertyName(name); if (value == null) { From 43627306f91f31bffa420ef45aca9721bfe55982 Mon Sep 17 00:00:00 2001 From: Youssef1313 Date: Tue, 14 Jul 2026 09:39:09 +0200 Subject: [PATCH 5/7] Fix deserializing of const null --- .../Reader/JsonNodeHelper.cs | 5 ++ .../V31Tests/OpenApiSchemaTests.cs | 49 +++++++++++++++++++ .../OpenApiSchema/schemaWithConstNull.json | 21 ++++++++ .../V32Tests/OpenApiSchemaTests.cs | 49 +++++++++++++++++++ .../OpenApiSchema/schemaWithConstNull.json | 22 +++++++++ 5 files changed, 146 insertions(+) create mode 100644 test/Microsoft.OpenApi.Readers.Tests/V31Tests/Samples/OpenApiSchema/schemaWithConstNull.json create mode 100644 test/Microsoft.OpenApi.Readers.Tests/V32Tests/Samples/OpenApiSchema/schemaWithConstNull.json diff --git a/src/Microsoft.OpenApi/Reader/JsonNodeHelper.cs b/src/Microsoft.OpenApi/Reader/JsonNodeHelper.cs index 85e2ed2ec..60b39270e 100644 --- a/src/Microsoft.OpenApi/Reader/JsonNodeHelper.cs +++ b/src/Microsoft.OpenApi/Reader/JsonNodeHelper.cs @@ -157,6 +157,11 @@ public static Dictionary> CreateArrayMap(this JsonNode? no public static string? GetScalarValue(this JsonNode? node) { + if (node.IsJsonNullSentinel()) + { + return null; + } + var scalarNode = node is JsonValue value ? value : throw new OpenApiException("Expected scalar value."); return Convert.ToString(scalarNode.GetValue(), CultureInfo.InvariantCulture); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs index 5cf558f7c..f0b22b02c 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs @@ -632,6 +632,55 @@ public async Task ParseSchemaWithConstWorks() Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), schemaString.MakeLineBreaksEnvironmentNeutral()); } + [Fact] + public async Task ParseSchemaWithConstNullWorks() + { + var expected = @"{ + ""$schema"": ""https://json-schema.org/draft/2020-12/schema"", + ""required"": [ + ""status"" + ], + ""type"": ""object"", + ""properties"": { + ""status"": { + ""const"": null, + ""type"": ""string"" + }, + ""user"": { + ""required"": [ + ""role"" + ], + ""type"": ""object"", + ""properties"": { + ""role"": { + ""const"": null, + ""type"": ""string"" + } + } + } + } +}"; + + var path = Path.Combine(SampleFolderPath, "schemaWithConstNull.json"); + + // Act + var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_1, new(), SettingsFixture.ReaderSettings); + + var statusSchema = Assert.IsType(schema.Properties["status"]); + Assert.Null(statusSchema.Const); + Assert.True(statusSchema.WasConstExplicitlySet); + + var userRoleSchema = Assert.IsType(schema.Properties["user"].Properties["role"]); + Assert.Null(userRoleSchema.Const); + Assert.True(userRoleSchema.WasConstExplicitlySet); + + // serialization + var writer = new StringWriter(); + schema.SerializeAsV31(new OpenApiJsonWriter(writer)); + var schemaString = writer.ToString(); + Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), schemaString.MakeLineBreaksEnvironmentNeutral()); + } + [Fact] public void ParseSchemaWithUnrecognizedKeywordsWorks() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/Samples/OpenApiSchema/schemaWithConstNull.json b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/Samples/OpenApiSchema/schemaWithConstNull.json new file mode 100644 index 000000000..db5290a5c --- /dev/null +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/Samples/OpenApiSchema/schemaWithConstNull.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "status": { + "type": "string", + "const": null + }, + "user": { + "type": "object", + "properties": { + "role": { + "type": "string", + "const": null + } + }, + "required": [ "role" ] + } + }, + "required": [ "status" ] +} diff --git a/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiSchemaTests.cs index a56850cde..de5e3202d 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiSchemaTests.cs @@ -534,6 +534,55 @@ public async Task ParseSchemaWithConstWorks() Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), schemaString.MakeLineBreaksEnvironmentNeutral()); } + [Fact] + public async Task ParseSchemaWithConstNullWorks() + { + var expected = @"{ + ""$schema"": ""https://json-schema.org/draft/2020-12/schema"", + ""required"": [ + ""status"" + ], + ""type"": ""object"", + ""properties"": { + ""status"": { + ""const"": null, + ""type"": ""string"" + }, + ""user"": { + ""required"": [ + ""role"" + ], + ""type"": ""object"", + ""properties"": { + ""role"": { + ""const"": null, + ""type"": ""string"" + } + } + } + } +}"; + + var path = Path.Combine(SampleFolderPath, "schemaWithConstNull.json"); + + // Act + var schema = await OpenApiModelFactory.LoadAsync(path, OpenApiSpecVersion.OpenApi3_2, new(), SettingsFixture.ReaderSettings); + + var statusSchema = Assert.IsType(schema.Properties["status"]); + Assert.Null(statusSchema.Const); + Assert.True(statusSchema.WasConstExplicitlySet); + + var userRoleSchema = Assert.IsType(schema.Properties["user"].Properties["role"]); + Assert.Null(userRoleSchema.Const); + Assert.True(userRoleSchema.WasConstExplicitlySet); + + // serialization + var writer = new StringWriter(); + schema.SerializeAsV32(new OpenApiJsonWriter(writer)); + var schemaString = writer.ToString(); + Assert.Equal(expected.MakeLineBreaksEnvironmentNeutral(), schemaString.MakeLineBreaksEnvironmentNeutral()); + } + [Fact] public void ParseSchemaWithUnrecognizedKeywordsWorks() { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V32Tests/Samples/OpenApiSchema/schemaWithConstNull.json b/test/Microsoft.OpenApi.Readers.Tests/V32Tests/Samples/OpenApiSchema/schemaWithConstNull.json new file mode 100644 index 000000000..586d2f726 --- /dev/null +++ b/test/Microsoft.OpenApi.Readers.Tests/V32Tests/Samples/OpenApiSchema/schemaWithConstNull.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "status": { + "type": "string", + "const": null + }, + "user": { + "type": "object", + "properties": { + "role": { + "type": "string", + "const": null + } + }, + "required": [ "role" ] + } + }, + "required": [ "status" ] +} + From 6b91e2b238acf809e6988202398cbbbe391543a1 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 14 Jul 2026 13:52:10 +0200 Subject: [PATCH 6/7] chore: update performance benchmark reports (#2) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> --- .../performance.Descriptions-report-github.md | 22 +++---- .../performance.Descriptions-report.csv | 12 ++-- .../performance.Descriptions-report.html | 22 +++---- .../performance.Descriptions-report.json | 2 +- .../performance.EmptyModels-report-github.md | 66 +++++++++---------- .../performance.EmptyModels-report.csv | 56 ++++++++-------- .../performance.EmptyModels-report.html | 66 +++++++++---------- .../performance.EmptyModels-report.json | 2 +- 8 files changed, 124 insertions(+), 124 deletions(-) diff --git a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report-github.md b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report-github.md index 13e3500c6..20ff98d54 100644 --- a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report-github.md +++ b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report-github.md @@ -1,20 +1,20 @@ ``` BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat) -AMD EPYC 7763 2.45GHz, 1 CPU, 4 logical and 2 physical cores +Intel Xeon Platinum 8370C CPU 2.80GHz, 1 CPU, 4 logical and 2 physical cores .NET SDK 10.0.301 - [Host] : .NET 8.0.28 (8.0.28, 8.0.2826.26413), X64 RyuJIT x86-64-v3 - ShortRun : .NET 8.0.28 (8.0.28, 8.0.2826.26413), X64 RyuJIT x86-64-v3 + [Host] : .NET 8.0.28 (8.0.28, 8.0.2826.26413), X64 RyuJIT x86-64-v4 + ShortRun : .NET 8.0.28 (8.0.28, 8.0.2826.26413), X64 RyuJIT x86-64-v4 Job=ShortRun IterationCount=3 LaunchCount=1 WarmupCount=3 ``` -| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated | -|------------- |---------------:|--------------:|-------------:|-----------:|-----------:|----------:|-------------:| -| PetStoreYaml | 491.4 μs | 72.31 μs | 3.96 μs | 18.5547 | 3.9063 | - | 314.57 KB | -| PetStoreJson | 199.4 μs | 19.87 μs | 1.09 μs | 10.7422 | 2.9297 | - | 176.42 KB | -| GHESYaml | 939,520.0 μs | 187,454.80 μs | 10,275.03 μs | 18000.0000 | 17000.0000 | 3000.0000 | 256688.91 KB | -| GHESJson | 282,084.8 μs | 100,501.66 μs | 5,508.84 μs | 6000.0000 | 5000.0000 | 1000.0000 | 113857.84 KB | -| GHESNextYaml | 1,152,354.7 μs | 45,814.56 μs | 2,511.25 μs | 30000.0000 | 18000.0000 | 3000.0000 | 452765.4 KB | -| GHESNextJson | 549,904.6 μs | 80,767.59 μs | 4,427.14 μs | 20000.0000 | 10000.0000 | 2000.0000 | 314529.52 KB | +| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated | +|------------- |---------------:|-------------:|-------------:|-----------:|-----------:|----------:|-------------:| +| PetStoreYaml | 528.1 μs | 177.6 μs | 9.74 μs | 11.7188 | - | - | 368.25 KB | +| PetStoreJson | 244.1 μs | 258.7 μs | 14.18 μs | 7.8125 | - | - | 202.25 KB | +| GHESYaml | 1,015,062.7 μs | 189,974.3 μs | 10,413.13 μs | 15000.0000 | 14000.0000 | 3000.0000 | 309638.7 KB | +| GHESJson | 348,239.6 μs | 155,668.6 μs | 8,532.72 μs | 6000.0000 | 5000.0000 | 1000.0000 | 139242.43 KB | +| GHESNextYaml | 1,236,771.2 μs | 88,165.1 μs | 4,832.63 μs | 23000.0000 | 14000.0000 | 3000.0000 | 511139.5 KB | +| GHESNextJson | 613,831.6 μs | 120,635.4 μs | 6,612.43 μs | 15000.0000 | 8000.0000 | 2000.0000 | 342968.27 KB | diff --git a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv index e390112ab..bac023554 100644 --- a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv +++ b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv @@ -1,7 +1,7 @@ Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,LargeAddressAware,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,Mean,Error,StdDev,Gen0,Gen1,Gen2,Allocated -PetStoreYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,491.4 μs,72.31 μs,3.96 μs,18.5547,3.9063,0.0000,314.57 KB -PetStoreJson,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,199.4 μs,19.87 μs,1.09 μs,10.7422,2.9297,0.0000,176.42 KB -GHESYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,"939,520.0 μs","187,454.80 μs","10,275.03 μs",18000.0000,17000.0000,3000.0000,256688.91 KB -GHESJson,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,"282,084.8 μs","100,501.66 μs","5,508.84 μs",6000.0000,5000.0000,1000.0000,113857.84 KB -GHESNextYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,"1,152,354.7 μs","45,814.56 μs","2,511.25 μs",30000.0000,18000.0000,3000.0000,452765.4 KB -GHESNextJson,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,"549,904.6 μs","80,767.59 μs","4,427.14 μs",20000.0000,10000.0000,2000.0000,314529.52 KB +PetStoreYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,528.1 μs,177.6 μs,9.74 μs,11.7188,0.0000,0.0000,368.25 KB +PetStoreJson,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,244.1 μs,258.7 μs,14.18 μs,7.8125,0.0000,0.0000,202.25 KB +GHESYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,"1,015,062.7 μs","189,974.3 μs","10,413.13 μs",15000.0000,14000.0000,3000.0000,309638.7 KB +GHESJson,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,"348,239.6 μs","155,668.6 μs","8,532.72 μs",6000.0000,5000.0000,1000.0000,139242.43 KB +GHESNextYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,"1,236,771.2 μs","88,165.1 μs","4,832.63 μs",23000.0000,14000.0000,3000.0000,511139.5 KB +GHESNextJson,ShortRun,False,Default,Default,Default,Default,Default,Default,1111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 8.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,3,Default,1,Default,Default,Default,Default,Default,Default,16,3,"613,831.6 μs","120,635.4 μs","6,612.43 μs",15000.0000,8000.0000,2000.0000,342968.27 KB diff --git a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html index c95b016a2..cdbfd78fe 100644 --- a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html +++ b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html @@ -2,7 +2,7 @@ -performance.Descriptions-20260629-200911 +performance.Descriptions-20260714-114210