From 640feadb25269d0a896880f3e9da5a37189f96b1 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Fri, 13 Nov 2026 13:05:11 -0500 Subject: [PATCH 1/3] fix(reader): balance example locations and defer reference paths Restore parsing locations after named examples, including exception paths, and construct locations only when relative reference resolution requires them. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: dc47aa82-c449-43a1-8a70-c4f3c464ae51 --- .../Models/BaseOpenApiReference.cs | 4 +- .../Reader/V3/OpenApiSchemaDeserializer.cs | 2 +- .../Reader/V3/OpenApiV3Deserializer.cs | 22 +++- .../Reader/V31/OpenApiSchemaDeserializer.cs | 6 +- .../Reader/V31/OpenApiV31Deserializer.cs | 22 +++- .../ParsingContextTests.cs | 110 ++++++++++++++++++ .../V31Tests/OpenApiDynamicRefTests.cs | 2 +- 7 files changed, 150 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/BaseOpenApiReference.cs b/src/Microsoft.OpenApi/Models/BaseOpenApiReference.cs index d32080890..506161298 100644 --- a/src/Microsoft.OpenApi/Models/BaseOpenApiReference.cs +++ b/src/Microsoft.OpenApi/Models/BaseOpenApiReference.cs @@ -317,7 +317,7 @@ protected virtual void SetAdditional31MetadataFromMapNode(JsonObject jsonObject) // noop for the base type } - internal void SetJsonPointerPath(string pointer, string nodeLocation) + internal void SetJsonPointerPath(string pointer, ParsingContext context) { // Relative reference to internal JSON schema node/resource (e.g. "#/properties/b") #if NETSTANDARD2_1 || NETCOREAPP2_1_OR_GREATER || NET5_0_OR_GREATER @@ -326,7 +326,7 @@ internal void SetJsonPointerPath(string pointer, string nodeLocation) if (pointer.StartsWith("#/", StringComparison.OrdinalIgnoreCase) && !pointer.ToLowerInvariant().Contains("/components/schemas")) #endif { - ReferenceV3 = ResolveRelativePointer(nodeLocation, pointer); + ReferenceV3 = ResolveRelativePointer(context.GetLocation(), pointer); } // Absolute reference or anchor (e.g. "#/components/schemas/..." or full URL) diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs index 22c7bf792..40b082752 100644 --- a/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiSchemaDeserializer.cs @@ -398,7 +398,7 @@ public static IOpenApiSchema LoadSchema(JsonNode node, OpenApiDocument hostDocum { var reference = GetReferenceIdAndExternalResource(pointer); var result = new OpenApiSchemaReference(reference.Item1, hostDocument, reference.Item2); - result.Reference.SetJsonPointerPath(pointer, context.GetLocation()); + result.Reference.SetJsonPointerPath(pointer, context); return result; } diff --git a/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs index 1e281afb0..17e78e0ca 100644 --- a/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V3/OpenApiV3Deserializer.cs @@ -75,15 +75,27 @@ private static void ProcessAnyMapFields( foreach (var propertyMapElement in mapElements) { context.StartObject(propertyMapElement.Key); - - if (propertyMapElement.Value != null) + try { - var any = anyMapFieldMap[anyMapFieldName].PropertyGetter(propertyMapElement.Value); - if (any is not null) + if (propertyMapElement.Value != null) { - anyMapFieldMap[anyMapFieldName].PropertySetter(propertyMapElement.Value, any); + var any = anyMapFieldMap[anyMapFieldName].PropertyGetter(propertyMapElement.Value); + if (any is not null) + { + anyMapFieldMap[anyMapFieldName].PropertySetter(propertyMapElement.Value, any); + } } } + catch (OpenApiException exception) + { + exception.Pointer = context.GetLocation(); + context.Diagnostic.Errors.Add(new(exception)); + break; + } + finally + { + context.EndObject(); + } } } } diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs index 52ca0912b..a1a3aae93 100644 --- a/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiSchemaDeserializer.cs @@ -434,7 +434,6 @@ public static IOpenApiSchema LoadSchema(JsonNode node, OpenApiDocument hostDocum if (pointer != null) { - var nodeLocation = context.GetLocation(); var reference = GetReferenceIdAndExternalResource(pointer); var result = new OpenApiSchemaReference(reference.Item1, hostDocument, reference.Item2); var referenceMetadata = new OpenApiSchema(); @@ -448,14 +447,13 @@ public static IOpenApiSchema LoadSchema(JsonNode node, OpenApiDocument hostDocum } }); result.Reference.ApplySchemaMetadata(referenceMetadata, jsonObject); - result.Reference.SetJsonPointerPath(pointer, nodeLocation); + result.Reference.SetJsonPointerPath(pointer, context); return result; } if (dynamicPointer != null) { - var nodeLocation = context.GetLocation(); var anchorName = JsonNodeHelper.ExtractDynamicAnchorName(dynamicPointer); string? externalResource = JsonNodeHelper.IsFragmentOnlyDynamicRef(dynamicPointer) ? null @@ -472,7 +470,7 @@ public static IOpenApiSchema LoadSchema(JsonNode node, OpenApiDocument hostDocum } }); result.Reference.ApplySchemaMetadata(referenceMetadata, jsonObject); - result.Reference.SetJsonPointerPath(dynamicPointer, nodeLocation); + result.Reference.SetJsonPointerPath(dynamicPointer, context); return result; } diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs index 617ee9ced..24c49b8ff 100644 --- a/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs @@ -74,15 +74,27 @@ private static void ProcessAnyMapFields( foreach (var propertyMapElement in propertyMapGetter) { context.StartObject(propertyMapElement.Key); - - if (propertyMapElement.Value != null) + try { - var any = anyMapFieldMap[anyMapFieldName].PropertyGetter(propertyMapElement.Value); - if (any is not null) + if (propertyMapElement.Value != null) { - anyMapFieldMap[anyMapFieldName].PropertySetter(propertyMapElement.Value, any); + var any = anyMapFieldMap[anyMapFieldName].PropertyGetter(propertyMapElement.Value); + if (any is not null) + { + anyMapFieldMap[anyMapFieldName].PropertySetter(propertyMapElement.Value, any); + } } } + catch (OpenApiException exception) + { + exception.Pointer = context.GetLocation(); + context.Diagnostic.Errors.Add(new OpenApiError(exception)); + break; + } + finally + { + context.EndObject(); + } } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/ParsingContextTests.cs b/test/Microsoft.OpenApi.Readers.Tests/ParsingContextTests.cs index f8a2111a8..86a899d11 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/ParsingContextTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/ParsingContextTests.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +using System; +using System.Text.Json.Nodes; using Microsoft.OpenApi.Reader; using Xunit; @@ -114,5 +116,113 @@ public void GetLocation_MultipleSegmentsWithSpecialChars_EscapesEachSegment() Assert.Equal("#/content/application~1json/schema", location); } + + [Theory] + [InlineData(OpenApiSpecVersion.OpenApi3_0, false)] + [InlineData(OpenApiSpecVersion.OpenApi3_0, true)] + [InlineData(OpenApiSpecVersion.OpenApi3_1, false)] + [InlineData(OpenApiSpecVersion.OpenApi3_1, true)] + public void ParseFragment_WithNamedExamples_RestoresLocation(OpenApiSpecVersion version, bool isParameter) + { + var context = CreateContext(); + context.StartObject("parent"); + var node = JsonNode.Parse(""" + { + "examples": { + "empty": {}, + "populated": { "value": "hello" } + } + } + """); + Assert.NotNull(node); + var document = new OpenApiDocument(); + + if (isParameter) + { + Assert.NotNull(context.ParseFragment(node, version, document)); + } + else + { + Assert.NotNull(context.ParseFragment(node, version, document)); + } + + Assert.Equal("#/parent", context.GetLocation()); + } + + [Theory] + [InlineData(OpenApiSpecVersion.OpenApi3_0, false)] + [InlineData(OpenApiSpecVersion.OpenApi3_0, true)] + [InlineData(OpenApiSpecVersion.OpenApi3_1, false)] + [InlineData(OpenApiSpecVersion.OpenApi3_1, true)] + public void ParseFragment_WhenNamedExampleThrows_RestoresLocation(OpenApiSpecVersion version, bool isParameter) + { + var context = CreateContext(); + context.StartObject("parent"); + var document = new OpenApiDocument(); + document.AddComponent("cycle", new OpenApiExampleReference("cycle", document)); + var node = JsonNode.Parse(""" + { + "examples": { + "cycle": { "$ref": "#/components/examples/cycle" } + } + } + """); + Assert.NotNull(node); + + if (isParameter) + { + Assert.Throws(() => context.ParseFragment(node, version, document)); + } + else + { + Assert.Throws(() => context.ParseFragment(node, version, document)); + } + + Assert.Equal("#/parent", context.GetLocation()); + } + + [Theory] + [InlineData(OpenApiSpecVersion.OpenApi3_0, false)] + [InlineData(OpenApiSpecVersion.OpenApi3_0, true)] + [InlineData(OpenApiSpecVersion.OpenApi3_1, false)] + [InlineData(OpenApiSpecVersion.OpenApi3_1, true)] + public void ParseFragment_WhenNamedExampleReportsError_PreservesExampleLocation(OpenApiSpecVersion version, bool isParameter) + { + var context = CreateContext(); + context.StartObject("parent"); + var document = new OpenApiDocument(); + document.AddComponent("unreadable", new UnreadableExampleReference()); + var node = JsonNode.Parse(""" + { + "examples": { + "unreadable": { "$ref": "#/components/examples/unreadable" } + } + } + """); + Assert.NotNull(node); + + if (isParameter) + { + Assert.NotNull(context.ParseFragment(node, version, document)); + } + else + { + Assert.NotNull(context.ParseFragment(node, version, document)); + } + + var error = Assert.Single(context.Diagnostic.Errors); + Assert.Equal("Cannot read example.", error.Message); + Assert.Equal("#/parent/examples/unreadable", error.Pointer); + Assert.Equal("#/parent", context.GetLocation()); + } + + private sealed class UnreadableExampleReference : OpenApiExampleReference + { + public UnreadableExampleReference() : base("unreadable") + { + } + + public override IOpenApiExample Target => throw new OpenApiException("Cannot read example."); + } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDynamicRefTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDynamicRefTests.cs index a862c971b..808a24ad7 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDynamicRefTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiDynamicRefTests.cs @@ -1439,7 +1439,7 @@ public void DynamicRefResolvesInObjectModelBuiltDocument() doc.Workspace.RegisterComponents(doc); var nextRef = Assert.IsType(tree.Properties["next"]); - nextRef.Reference.SetJsonPointerPath("#node", "#/components/schemas/Tree/properties/next"); + nextRef.Reference.SetJsonPointerPath("#node", new ParsingContext(new())); Assert.True(nextRef.Reference.IsDynamicRefOnly); Assert.NotNull(nextRef.Target); Assert.Same(tree, nextRef.Target); From 50deb184dfe5cd44eabf3756df561a239f6bd3cf Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Fri, 13 Nov 2026 13:19:13 -0500 Subject: [PATCH 2/3] fix(reader): apply location optimizations to OpenAPI 3.2 Extend the main-branch port with balanced example scopes, lazy reference locations, and OpenAPI 3.2 regression coverage. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: dc47aa82-c449-43a1-8a70-c4f3c464ae51 --- .../Reader/V32/OpenApiSchemaDeserializer.cs | 6 ++--- .../Reader/V32/OpenApiV32Deserializer.cs | 22 ++++++++++++++----- .../ParsingContextTests.cs | 6 +++++ .../V32Tests/OpenApiDynamicRefTests.cs | 2 +- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.OpenApi/Reader/V32/OpenApiSchemaDeserializer.cs b/src/Microsoft.OpenApi/Reader/V32/OpenApiSchemaDeserializer.cs index b038fa6e5..7578b62e8 100644 --- a/src/Microsoft.OpenApi/Reader/V32/OpenApiSchemaDeserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V32/OpenApiSchemaDeserializer.cs @@ -434,7 +434,6 @@ public static IOpenApiSchema LoadSchema(JsonNode node, OpenApiDocument hostDocum if (pointer != null) { - var nodeLocation = context.GetLocation(); var reference = GetReferenceIdAndExternalResource(pointer); var result = new OpenApiSchemaReference(reference.Item1, hostDocument, reference.Item2); var referenceMetadata = new OpenApiSchema(); @@ -448,14 +447,13 @@ public static IOpenApiSchema LoadSchema(JsonNode node, OpenApiDocument hostDocum } }); result.Reference.ApplySchemaMetadata(referenceMetadata, jsonObject); - result.Reference.SetJsonPointerPath(pointer, nodeLocation); + result.Reference.SetJsonPointerPath(pointer, context); return result; } if (dynamicPointer != null) { - var nodeLocation = context.GetLocation(); var anchorName = JsonNodeHelper.ExtractDynamicAnchorName(dynamicPointer); string? externalResource = JsonNodeHelper.IsFragmentOnlyDynamicRef(dynamicPointer) ? null @@ -472,7 +470,7 @@ public static IOpenApiSchema LoadSchema(JsonNode node, OpenApiDocument hostDocum } }); result.Reference.ApplySchemaMetadata(referenceMetadata, jsonObject); - result.Reference.SetJsonPointerPath(dynamicPointer, nodeLocation); + result.Reference.SetJsonPointerPath(dynamicPointer, context); return result; } diff --git a/src/Microsoft.OpenApi/Reader/V32/OpenApiV32Deserializer.cs b/src/Microsoft.OpenApi/Reader/V32/OpenApiV32Deserializer.cs index 5efed4657..c989da889 100644 --- a/src/Microsoft.OpenApi/Reader/V32/OpenApiV32Deserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V32/OpenApiV32Deserializer.cs @@ -74,15 +74,27 @@ private static void ProcessAnyMapFields( foreach (var propertyMapElement in propertyMapGetter) { context.StartObject(propertyMapElement.Key); - - if (propertyMapElement.Value != null) + try { - var any = anyMapFieldMap[anyMapFieldName].PropertyGetter(propertyMapElement.Value); - if (any is not null) + if (propertyMapElement.Value != null) { - anyMapFieldMap[anyMapFieldName].PropertySetter(propertyMapElement.Value, any); + var any = anyMapFieldMap[anyMapFieldName].PropertyGetter(propertyMapElement.Value); + if (any is not null) + { + anyMapFieldMap[anyMapFieldName].PropertySetter(propertyMapElement.Value, any); + } } } + catch (OpenApiException exception) + { + exception.Pointer = context.GetLocation(); + context.Diagnostic.Errors.Add(new OpenApiError(exception)); + break; + } + finally + { + context.EndObject(); + } } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/ParsingContextTests.cs b/test/Microsoft.OpenApi.Readers.Tests/ParsingContextTests.cs index 86a899d11..984d9ce0d 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/ParsingContextTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/ParsingContextTests.cs @@ -122,6 +122,8 @@ public void GetLocation_MultipleSegmentsWithSpecialChars_EscapesEachSegment() [InlineData(OpenApiSpecVersion.OpenApi3_0, true)] [InlineData(OpenApiSpecVersion.OpenApi3_1, false)] [InlineData(OpenApiSpecVersion.OpenApi3_1, true)] + [InlineData(OpenApiSpecVersion.OpenApi3_2, false)] + [InlineData(OpenApiSpecVersion.OpenApi3_2, true)] public void ParseFragment_WithNamedExamples_RestoresLocation(OpenApiSpecVersion version, bool isParameter) { var context = CreateContext(); @@ -154,6 +156,8 @@ public void ParseFragment_WithNamedExamples_RestoresLocation(OpenApiSpecVersion [InlineData(OpenApiSpecVersion.OpenApi3_0, true)] [InlineData(OpenApiSpecVersion.OpenApi3_1, false)] [InlineData(OpenApiSpecVersion.OpenApi3_1, true)] + [InlineData(OpenApiSpecVersion.OpenApi3_2, false)] + [InlineData(OpenApiSpecVersion.OpenApi3_2, true)] public void ParseFragment_WhenNamedExampleThrows_RestoresLocation(OpenApiSpecVersion version, bool isParameter) { var context = CreateContext(); @@ -186,6 +190,8 @@ public void ParseFragment_WhenNamedExampleThrows_RestoresLocation(OpenApiSpecVer [InlineData(OpenApiSpecVersion.OpenApi3_0, true)] [InlineData(OpenApiSpecVersion.OpenApi3_1, false)] [InlineData(OpenApiSpecVersion.OpenApi3_1, true)] + [InlineData(OpenApiSpecVersion.OpenApi3_2, false)] + [InlineData(OpenApiSpecVersion.OpenApi3_2, true)] public void ParseFragment_WhenNamedExampleReportsError_PreservesExampleLocation(OpenApiSpecVersion version, bool isParameter) { var context = CreateContext(); diff --git a/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiDynamicRefTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiDynamicRefTests.cs index 1e3140931..ec0994d81 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiDynamicRefTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V32Tests/OpenApiDynamicRefTests.cs @@ -1794,7 +1794,7 @@ public void DynamicRefResolvesInObjectModelBuiltDocument() doc.Workspace.RegisterComponents(doc); var nextRef = Assert.IsType(tree.Properties["next"]); - nextRef.Reference.SetJsonPointerPath("#node", "#/components/schemas/Tree/properties/next"); + nextRef.Reference.SetJsonPointerPath("#node", new ParsingContext(new())); Assert.True(nextRef.Reference.IsDynamicRefOnly); Assert.NotNull(nextRef.Target); Assert.Same(tree, nextRef.Target); From c9179bb2519c632511ca8baea44ab119c34fb981 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Fri, 13 Nov 2026 13:29:36 -0500 Subject: [PATCH 3/3] chore(benchmark): refresh main performance reports Regenerate all description and empty-model benchmark reports after porting the reference allocation fixes to main. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: dc47aa82-c449-43a1-8a70-c4f3c464ae51 --- .../performance.Descriptions-report-github.md | 26 +++---- .../performance.Descriptions-report.csv | 12 ++-- .../performance.Descriptions-report.html | 26 +++---- .../performance.Descriptions-report.json | 2 +- .../performance.EmptyModels-report-github.md | 70 +++++++++---------- .../performance.EmptyModels-report.csv | 56 +++++++-------- .../performance.EmptyModels-report.html | 70 +++++++++---------- .../performance.EmptyModels-report.json | 2 +- 8 files changed, 132 insertions(+), 132 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 95726f79a..2979e8160 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 -.NET SDK 10.0.400 - [Host] : .NET 8.0.30 (8.0.30, 8.0.3026.36720), X64 RyuJIT x86-64-v3 - ShortRun : .NET 8.0.30 (8.0.30, 8.0.3026.36720), X64 RyuJIT x86-64-v3 +BenchmarkDotNet v0.15.8, Windows 11 (10.0.26300.9711) +Snapdragon X 12-core X1E80100 3.40 GHz (Max: 3.42GHz), 1 CPU, 12 logical and 12 physical cores +.NET SDK 10.0.403 + [Host] : .NET 8.0.34 (8.0.34, 8.0.3426.52217), Arm64 RyuJIT armv8.0-a + ShortRun : .NET 8.0.34 (8.0.34, 8.0.3426.52217), Arm64 RyuJIT armv8.0-a Job=ShortRun IterationCount=3 LaunchCount=1 WarmupCount=3 ``` -| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated | -|------------- |---------------:|--------------:|-------------:|-----------:|-----------:|----------:|-------------:| -| PetStoreYaml | 569.0 μs | 108.17 μs | 5.93 μs | 19.5313 | - | - | 327.8 KB | -| PetStoreJson | 250.8 μs | 20.85 μs | 1.14 μs | 11.7188 | 1.9531 | - | 209.67 KB | -| GHESYaml | 831,169.7 μs | 217,393.05 μs | 11,916.05 μs | 18000.0000 | 10000.0000 | 2000.0000 | 267570.8 KB | -| GHESJson | 367,711.4 μs | 135,955.63 μs | 7,452.19 μs | 9000.0000 | 8000.0000 | 2000.0000 | 140917.06 KB | -| GHESNextYaml | 1,040,243.2 μs | 167,595.29 μs | 9,186.46 μs | 30000.0000 | 11000.0000 | 2000.0000 | 469507.05 KB | -| GHESNextJson | 615,173.6 μs | 143,051.39 μs | 7,841.13 μs | 22000.0000 | 10000.0000 | 2000.0000 | 345247.91 KB | +| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated | +|------------- |-------------:|--------------:|-------------:|-----------:|-----------:|----------:|-------------:| +| PetStoreYaml | 345.8 μs | 69.85 μs | 3.83 μs | 78.1250 | 11.7188 | - | 329.19 KB | +| PetStoreJson | 155.7 μs | 1.06 μs | 0.06 μs | 50.7813 | 9.7656 | - | 211.35 KB | +| GHESYaml | 608,273.7 μs | 86,098.51 μs | 4,719.35 μs | 47000.0000 | 14000.0000 | 3000.0000 | 267921.01 KB | +| GHESJson | 325,277.9 μs | 83,983.75 μs | 4,603.43 μs | 23000.0000 | 11000.0000 | 2000.0000 | 141267.53 KB | +| GHESNextYaml | 641,025.5 μs | 220,286.78 μs | 12,074.66 μs | 50000.0000 | 15000.0000 | 3000.0000 | 282745.1 KB | +| GHESNextJson | 362,873.4 μs | 136,951.76 μs | 7,506.79 μs | 26000.0000 | 12000.0000 | 2000.0000 | 158487.98 KB | diff --git a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.csv index bb632a223..e9037adf2 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,569.0 μs,108.17 μs,5.93 μs,19.5313,0.0000,0.0000,327.8 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,250.8 μs,20.85 μs,1.14 μs,11.7188,1.9531,0.0000,209.67 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,"831,169.7 μs","217,393.05 μs","11,916.05 μs",18000.0000,10000.0000,2000.0000,267570.8 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,"367,711.4 μs","135,955.63 μs","7,452.19 μs",9000.0000,8000.0000,2000.0000,140917.06 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,040,243.2 μs","167,595.29 μs","9,186.46 μs",30000.0000,11000.0000,2000.0000,469507.05 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,"615,173.6 μs","143,051.39 μs","7,841.13 μs",22000.0000,10000.0000,2000.0000,345247.91 KB +PetStoreYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,111111111111,Empty,RyuJit,Default,Arm64,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,345.8 μs,69.85 μs,3.83 μs,78.1250,11.7188,0.0000,329.19 KB +PetStoreJson,ShortRun,False,Default,Default,Default,Default,Default,Default,111111111111,Empty,RyuJit,Default,Arm64,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,155.7 μs,1.06 μs,0.06 μs,50.7813,9.7656,0.0000,211.35 KB +GHESYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,111111111111,Empty,RyuJit,Default,Arm64,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,"608,273.7 μs","86,098.51 μs","4,719.35 μs",47000.0000,14000.0000,3000.0000,267921.01 KB +GHESJson,ShortRun,False,Default,Default,Default,Default,Default,Default,111111111111,Empty,RyuJit,Default,Arm64,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,"325,277.9 μs","83,983.75 μs","4,603.43 μs",23000.0000,11000.0000,2000.0000,141267.53 KB +GHESNextYaml,ShortRun,False,Default,Default,Default,Default,Default,Default,111111111111,Empty,RyuJit,Default,Arm64,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,"641,025.5 μs","220,286.78 μs","12,074.66 μs",50000.0000,15000.0000,3000.0000,282745.1 KB +GHESNextJson,ShortRun,False,Default,Default,Default,Default,Default,Default,111111111111,Empty,RyuJit,Default,Arm64,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,"362,873.4 μs","136,951.76 μs","7,506.79 μs",26000.0000,12000.0000,2000.0000,158487.98 KB diff --git a/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html b/performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html index c9feca148..d9edd3657 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-20260819-014451 +performance.Descriptions-20261113-131950