From ac6d8b608e5aad042f796be6686b5b294f1123e7 Mon Sep 17 00:00:00 2001 From: costabello matthieu Date: Mon, 29 Sep 2025 17:15:33 -0400 Subject: [PATCH 1/5] add defaultMapping in discriminator --- .../Models/OpenApiDiscriminator.cs | 27 +++++++++++ .../V3/OpenApiDiscriminatorDeserializer.cs | 11 ++++- .../V31/OpenApiDiscriminatorDeserializer.cs | 13 +++++- .../V32/OpenApiDiscriminatorDeserializer.cs | 8 +++- .../V31Tests/OpenApiDiscriminatorTests.cs | 46 +++++++++++++++++++ .../basicDiscriminator.yaml | 6 +++ .../V32Tests/OpenApiDiscriminatorTests.cs | 46 +++++++++++++++++++ .../basicDiscriminator.yaml | 6 +++ .../V3Tests/OpenApiDiscriminatorTests.cs | 3 +- .../basicDiscriminator.yaml | 3 +- 10 files changed, 164 insertions(+), 5 deletions(-) create mode 100644 test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDiscriminatorTests.cs create mode 100644 test/Microsoft.OpenApi.Readers.Tests/V31Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml create mode 100644 test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiDiscriminatorTests.cs create mode 100644 test/Microsoft.OpenApi.Readers.Tests/V32Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml diff --git a/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs b/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs index eda3b4b21..c1fde30cd 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs @@ -25,6 +25,11 @@ public class OpenApiDiscriminator : IOpenApiSerializable, IOpenApiExtensible /// public IDictionary? Extensions { get; set; } + /// + /// OAI 3.2.0: The schema name or URI reference to a schema that is expected to validate the structure of the model when the discriminating property is not present in the payload or contains a value for which there is no explicit or implicit mapping. + /// + public OpenApiSchemaReference? DefaultMapping { get; set; } + /// /// Parameter-less constructor /// @@ -38,6 +43,7 @@ public OpenApiDiscriminator(OpenApiDiscriminator discriminator) PropertyName = discriminator?.PropertyName ?? PropertyName; Mapping = discriminator?.Mapping != null ? new Dictionary(discriminator.Mapping) : null; Extensions = discriminator?.Extensions != null ? new Dictionary(discriminator.Extensions) : null; + DefaultMapping = discriminator?.DefaultMapping; } /// @@ -48,6 +54,13 @@ public void SerializeAsV32(IOpenApiWriter writer) { SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_2); + // Write defaultMapping property in 3.2.0 + if (DefaultMapping != null) + { + writer.WritePropertyName("defaultMapping"); + DefaultMapping.SerializeAsV32(writer); + } + // extensions writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_2); @@ -62,6 +75,13 @@ public void SerializeAsV31(IOpenApiWriter writer) { SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_1); + // Write as x-oas-default-mapping extension in 3.1.0 + if (DefaultMapping != null) + { + writer.WritePropertyName("x-oas-default-mapping"); + DefaultMapping.SerializeAsV31(writer); + } + // extensions writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi3_1); @@ -75,6 +95,13 @@ public void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0); + // Write as x-oas-default-mapping extension in 3.0.0 + if (DefaultMapping != null) + { + writer.WritePropertyName("x-oas-default-mapping"); + DefaultMapping.SerializeAsV3(writer); + } + writer.WriteEndObject(); } diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs index a32cbcd55..1897a94a5 100644 --- a/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs @@ -24,7 +24,16 @@ internal static partial class OpenApiV3Deserializer } }; - private static readonly PatternFieldMap _discriminatorPatternFields = new(); + private static readonly PatternFieldMap _discriminatorPatternFields = new() { + {s => s.StartsWith(OpenApiConstants.ExtensionFieldNamePrefix, StringComparison.OrdinalIgnoreCase), (o, p, n, doc) => { + // Handle x-oas-default-mapping as DefaultMapping property + if (p.Equals("x-oas-default-mapping", StringComparison.OrdinalIgnoreCase)) + { + o.DefaultMapping = LoadMapping(n, doc); + } + } + } + }; public static OpenApiDiscriminator LoadDiscriminator(ParseNode node, OpenApiDocument hostDocument) { diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiDiscriminatorDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiDiscriminatorDeserializer.cs index c8c5555b1..3f4070827 100644 --- a/src/Microsoft.OpenApi/Reader/V31/OpenApiDiscriminatorDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiDiscriminatorDeserializer.cs @@ -28,7 +28,18 @@ internal static partial class OpenApiV31Deserializer private static readonly PatternFieldMap _discriminatorPatternFields = new() { - {s => s.StartsWith(OpenApiConstants.ExtensionFieldNamePrefix, StringComparison.OrdinalIgnoreCase), (o, p, n, _) => o.AddExtension(p, LoadExtension(p,n))} + {s => s.StartsWith(OpenApiConstants.ExtensionFieldNamePrefix, StringComparison.OrdinalIgnoreCase), (o, p, n, doc) => { + // Handle x-oas-default-mapping as DefaultMapping property + if (p.Equals("x-oas-default-mapping", StringComparison.OrdinalIgnoreCase)) + { + o.DefaultMapping = LoadMapping(n, doc); + } + else + { + o.AddExtension(p, LoadExtension(p, n)); + } + } + } }; public static OpenApiDiscriminator LoadDiscriminator(ParseNode node, OpenApiDocument hostDocument) diff --git a/src/Microsoft.OpenApi/Reader/V32/OpenApiDiscriminatorDeserializer.cs b/src/Microsoft.OpenApi/Reader/V32/OpenApiDiscriminatorDeserializer.cs index 285aa025f..bb0383968 100644 --- a/src/Microsoft.OpenApi/Reader/V32/OpenApiDiscriminatorDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V32/OpenApiDiscriminatorDeserializer.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace Microsoft.OpenApi.Reader.V32 { @@ -22,6 +22,12 @@ internal static partial class OpenApiV32Deserializer { o.Mapping = n.CreateSimpleMap((node) => LoadMapping(node, doc)); } + }, + { + "defaultMapping", (o, n, doc) => + { + o.DefaultMapping = LoadMapping(n, doc); + } } }; diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDiscriminatorTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDiscriminatorTests.cs new file mode 100644 index 000000000..1abb7f7a9 --- /dev/null +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDiscriminatorTests.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using Microsoft.OpenApi.Reader; +using Xunit; + +namespace Microsoft.OpenApi.Readers.Tests.V31Tests +{ + [Collection("DefaultSettings")] + public class OpenApiDiscriminatorTests + { + private const string SampleFolderPath = "V31Tests/Samples/OpenApiDiscriminator/"; + + [Fact] + public async Task ParseBasicDiscriminatorShouldSucceed() + { + // Arrange + using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "basicDiscriminator.yaml")); + // Copy stream to MemoryStream + using var memoryStream = new MemoryStream(); + await stream.CopyToAsync(memoryStream); + memoryStream.Position = 0; + + // Act + var openApiDocument = new OpenApiDocument(); + var discriminator = OpenApiModelFactory.Load(memoryStream, OpenApiSpecVersion.OpenApi3_1, OpenApiConstants.Yaml, openApiDocument, out var diagnostic, SettingsFixture.ReaderSettings); + + // Assert + Assert.Equivalent( + new OpenApiDiscriminator + { + PropertyName = "pet_type", + Mapping = new Dictionary + { + ["puppy"] = new OpenApiSchemaReference("Dog", openApiDocument), + ["kitten"] = new OpenApiSchemaReference("Cat" , openApiDocument, "https://gigantic-server.com/schemas/animals.json"), + ["monster"] = new OpenApiSchemaReference("monster" , openApiDocument, "https://gigantic-server.com/schemas/Monster/schema.json") + }, + DefaultMapping = new OpenApiSchemaReference("Animal", openApiDocument) + }, discriminator); + } + } +} diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml new file mode 100644 index 000000000..ad8f199c7 --- /dev/null +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml @@ -0,0 +1,6 @@ +propertyName: pet_type +mapping: + puppy: '#/components/schemas/Dog' + kitten: https://gigantic-server.com/schemas/animals.json#/components/schemas/Cat + monster: https://gigantic-server.com/schemas/Monster/schema.json#/components/schemas/monster +x-oas-default-mapping: '#/components/schemas/Animal' \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiDiscriminatorTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiDiscriminatorTests.cs new file mode 100644 index 000000000..4b359546e --- /dev/null +++ b/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiDiscriminatorTests.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using Microsoft.OpenApi.Reader; +using Xunit; + +namespace Microsoft.OpenApi.Readers.Tests.V32Tests +{ + [Collection("DefaultSettings")] + public class OpenApiDiscriminatorTests + { + private const string SampleFolderPath = "V32Tests/Samples/OpenApiDiscriminator/"; + + [Fact] + public async Task ParseBasicDiscriminatorShouldSucceed() + { + // Arrange + using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "basicDiscriminator.yaml")); + // Copy stream to MemoryStream + using var memoryStream = new MemoryStream(); + await stream.CopyToAsync(memoryStream); + memoryStream.Position = 0; + + // Act + var openApiDocument = new OpenApiDocument(); + var discriminator = OpenApiModelFactory.Load(memoryStream, OpenApiSpecVersion.OpenApi3_2, OpenApiConstants.Yaml, openApiDocument, out var diagnostic, SettingsFixture.ReaderSettings); + + // Assert + Assert.Equivalent( + new OpenApiDiscriminator + { + PropertyName = "pet_type", + Mapping = new Dictionary + { + ["puppy"] = new OpenApiSchemaReference("Dog", openApiDocument), + ["kitten"] = new OpenApiSchemaReference("Cat" , openApiDocument, "https://gigantic-server.com/schemas/animals.json"), + ["monster"] = new OpenApiSchemaReference("monster" , openApiDocument, "https://gigantic-server.com/schemas/Monster/schema.json") + }, + DefaultMapping = new OpenApiSchemaReference("Animal", openApiDocument) + }, discriminator); + } + } +} diff --git a/test/Microsoft.OpenApi.Readers.Tests/V32Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml b/test/Microsoft.OpenApi.Readers.Tests/V32Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml new file mode 100644 index 000000000..727fc812c --- /dev/null +++ b/test/Microsoft.OpenApi.Readers.Tests/V32Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml @@ -0,0 +1,6 @@ +propertyName: pet_type +mapping: + puppy: '#/components/schemas/Dog' + kitten: https://gigantic-server.com/schemas/animals.json#/components/schemas/Cat + monster: https://gigantic-server.com/schemas/Monster/schema.json#/components/schemas/monster +defaultMapping: '#/components/schemas/Animal' \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs index 9c0a9c0b6..503f98b05 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs @@ -38,7 +38,8 @@ public async Task ParseBasicDiscriminatorShouldSucceed() ["puppy"] = new OpenApiSchemaReference("Dog", openApiDocument), ["kitten"] = new OpenApiSchemaReference("Cat" , openApiDocument, "https://gigantic-server.com/schemas/animals.json"), ["monster"] = new OpenApiSchemaReference("schema.json" , openApiDocument, "https://gigantic-server.com/schemas/Monster/schema.json") - } + }, + DefaultMapping = new OpenApiSchemaReference("Animal", openApiDocument) }, discriminator); } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml index 21e6adc6c..7c7957fa9 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml @@ -2,4 +2,5 @@ mapping: puppy: '#/components/schemas/Dog' kitten: https://gigantic-server.com/schemas/animals.json#/components/schemas/Cat - monster: https://gigantic-server.com/schemas/Monster/schema.json \ No newline at end of file + monster: https://gigantic-server.com/schemas/Monster/schema.json +x-oas-default-mapping: '#/components/schemas/Animal' \ No newline at end of file From def8b924dc5579cf656a5f06ddae90ad93e5c178 Mon Sep 17 00:00:00 2001 From: costabello matthieu Date: Mon, 29 Sep 2025 17:28:21 -0400 Subject: [PATCH 2/5] public api --- test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt index 5ad03ed5f..44f690dfa 100644 --- a/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt +++ b/test/Microsoft.OpenApi.Tests/PublicApi/PublicApi.approved.txt @@ -594,6 +594,7 @@ namespace Microsoft.OpenApi { public OpenApiDiscriminator() { } public OpenApiDiscriminator(Microsoft.OpenApi.OpenApiDiscriminator discriminator) { } + public Microsoft.OpenApi.OpenApiSchemaReference? DefaultMapping { get; set; } public System.Collections.Generic.IDictionary? Extensions { get; set; } public System.Collections.Generic.IDictionary? Mapping { get; set; } public string? PropertyName { get; set; } From bfbd0650e96c88400dad66cbc7099435b3af741f Mon Sep 17 00:00:00 2001 From: costabello matthieu Date: Tue, 30 Sep 2025 14:31:48 -0400 Subject: [PATCH 3/5] ignore DefaultMapping if V3 --- src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs | 7 ------- .../Reader/V3/OpenApiDiscriminatorDeserializer.cs | 11 +---------- .../V3Tests/OpenApiDiscriminatorTests.cs | 4 ++-- .../OpenApiDiscriminator/basicDiscriminator.yaml | 1 - 4 files changed, 3 insertions(+), 20 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs b/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs index c1fde30cd..69e15f9a4 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiDiscriminator.cs @@ -95,13 +95,6 @@ public void SerializeAsV3(IOpenApiWriter writer) { SerializeInternal(writer, OpenApiSpecVersion.OpenApi3_0); - // Write as x-oas-default-mapping extension in 3.0.0 - if (DefaultMapping != null) - { - writer.WritePropertyName("x-oas-default-mapping"); - DefaultMapping.SerializeAsV3(writer); - } - writer.WriteEndObject(); } diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs index 1897a94a5..7d40df780 100644 --- a/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiDiscriminatorDeserializer.cs @@ -24,16 +24,7 @@ internal static partial class OpenApiV3Deserializer } }; - private static readonly PatternFieldMap _discriminatorPatternFields = new() { - {s => s.StartsWith(OpenApiConstants.ExtensionFieldNamePrefix, StringComparison.OrdinalIgnoreCase), (o, p, n, doc) => { - // Handle x-oas-default-mapping as DefaultMapping property - if (p.Equals("x-oas-default-mapping", StringComparison.OrdinalIgnoreCase)) - { - o.DefaultMapping = LoadMapping(n, doc); - } - } - } - }; + private static readonly PatternFieldMap _discriminatorPatternFields = new() {}; public static OpenApiDiscriminator LoadDiscriminator(ParseNode node, OpenApiDocument hostDocument) { diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs index 503f98b05..5e4a36d91 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDiscriminatorTests.cs @@ -28,6 +28,7 @@ public async Task ParseBasicDiscriminatorShouldSucceed() var openApiDocument = new OpenApiDocument(); var discriminator = OpenApiModelFactory.Load(memoryStream, OpenApiSpecVersion.OpenApi3_0, OpenApiConstants.Yaml, openApiDocument, out var diagnostic, SettingsFixture.ReaderSettings); + // Assert Assert.Equivalent( new OpenApiDiscriminator @@ -38,8 +39,7 @@ public async Task ParseBasicDiscriminatorShouldSucceed() ["puppy"] = new OpenApiSchemaReference("Dog", openApiDocument), ["kitten"] = new OpenApiSchemaReference("Cat" , openApiDocument, "https://gigantic-server.com/schemas/animals.json"), ["monster"] = new OpenApiSchemaReference("schema.json" , openApiDocument, "https://gigantic-server.com/schemas/Monster/schema.json") - }, - DefaultMapping = new OpenApiSchemaReference("Animal", openApiDocument) + } }, discriminator); } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml index 7c7957fa9..81bf8952e 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDiscriminator/basicDiscriminator.yaml @@ -3,4 +3,3 @@ mapping: puppy: '#/components/schemas/Dog' kitten: https://gigantic-server.com/schemas/animals.json#/components/schemas/Cat monster: https://gigantic-server.com/schemas/Monster/schema.json -x-oas-default-mapping: '#/components/schemas/Animal' \ No newline at end of file From 39ed5b7e24efcb4b66be077ffba265d71898a8b0 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Tue, 30 Sep 2025 16:43:55 -0400 Subject: [PATCH 4/5] chore: updates benchmark information Signed-off-by: Vincent Biret --- .../performance.Descriptions-report-github.md | 20 +++--- .../performance.Descriptions-report.csv | 8 +-- .../performance.Descriptions-report.html | 20 +++--- .../performance.Descriptions-report.json | 2 +- .../performance.EmptyModels-report-github.md | 68 +++++++++---------- .../performance.EmptyModels-report.csv | 58 ++++++++-------- .../performance.EmptyModels-report.html | 68 +++++++++---------- .../performance.EmptyModels-report.json | 2 +- 8 files changed, 123 insertions(+), 123 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 a9df33114..bc4613892 100644 --- a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report-github.md +++ b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report-github.md @@ -1,18 +1,18 @@ ``` -BenchmarkDotNet v0.15.4, Linux Ubuntu 24.04.3 LTS (Noble Numbat) -AMD EPYC 7763 2.45GHz, 1 CPU, 4 logical and 2 physical cores +BenchmarkDotNet v0.15.4, Windows 11 (10.0.26200.6584) +11th Gen Intel Core i7-1185G7 3.00GHz, 1 CPU, 8 logical and 4 physical cores .NET SDK 8.0.414 - [Host] : .NET 8.0.20 (8.0.20, 8.0.2025.41914), X64 RyuJIT x86-64-v3 - ShortRun : .NET 8.0.20 (8.0.20, 8.0.2025.41914), X64 RyuJIT x86-64-v3 + [Host] : .NET 8.0.20 (8.0.20, 8.0.2025.41914), X64 RyuJIT x86-64-v4 + ShortRun : .NET 8.0.20 (8.0.20, 8.0.2025.41914), X64 RyuJIT x86-64-v4 Job=ShortRun IterationCount=3 LaunchCount=1 WarmupCount=3 ``` -| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated | -|------------- |---------------:|--------------:|------------:|-----------:|-----------:|----------:|-------------:| -| PetStoreYaml | 513.8 μs | 220.40 μs | 12.08 μs | 23.4375 | 3.9063 | - | 387.37 KB | -| PetStoreJson | 235.7 μs | 19.54 μs | 1.07 μs | 13.6719 | 1.9531 | - | 249.22 KB | -| GHESYaml | 1,008,778.7 μs | 50,002.60 μs | 2,740.81 μs | 26000.0000 | 20000.0000 | 3000.0000 | 384508.01 KB | -| GHESJson | 469,189.2 μs | 144,923.46 μs | 7,943.74 μs | 16000.0000 | 9000.0000 | 2000.0000 | 245977.2 KB | +| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated | +|------------- |---------------:|----------------:|-------------:|-----------:|-----------:|----------:|-------------:| +| PetStoreYaml | 658.1 μs | 3,203.12 μs | 175.57 μs | 62.5000 | 11.7188 | - | 387.37 KB | +| PetStoreJson | 234.4 μs | 95.66 μs | 5.24 μs | 39.0625 | 7.8125 | - | 249.52 KB | +| GHESYaml | 1,091,206.2 μs | 1,279,076.97 μs | 70,110.52 μs | 66000.0000 | 22000.0000 | 4000.0000 | 384511.66 KB | +| GHESJson | 529,296.1 μs | 792,456.10 μs | 43,437.19 μs | 40000.0000 | 16000.0000 | 3000.0000 | 245982.38 KB | diff --git a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv index 683e975b7..2f1dc9b93 100644 --- a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv +++ b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv @@ -1,5 +1,5 @@ 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,513.8 μs,220.40 μs,12.08 μs,23.4375,3.9063,0.0000,387.37 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,235.7 μs,19.54 μs,1.07 μs,13.6719,1.9531,0.0000,249.22 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,008,778.7 μs","50,002.60 μs","2,740.81 μs",26000.0000,20000.0000,3000.0000,384508.01 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,"469,189.2 μs","144,923.46 μs","7,943.74 μs",16000.0000,9000.0000,2000.0000,245977.2 KB +PetStoreYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,11111111,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,658.1 μs,"3,203.12 μs",175.57 μs,62.5000,11.7188,0.0000,387.37 KB +PetStoreJson,ShortRun,False,Default,Default,Default,Default,Default,Default,11111111,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,234.4 μs,95.66 μs,5.24 μs,39.0625,7.8125,0.0000,249.52 KB +GHESYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,11111111,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,091,206.2 μs","1,279,076.97 μs","70,110.52 μs",66000.0000,22000.0000,4000.0000,384511.66 KB +GHESJson,ShortRun,False,Default,Default,Default,Default,Default,Default,11111111,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,"529,296.1 μs","792,456.10 μs","43,437.19 μs",40000.0000,16000.0000,3000.0000,245982.38 KB diff --git a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html index e8f53868c..4d58d5ef9 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-20250929-235233 +performance.Descriptions-20250930-163535