Skip to content

Commit f690681

Browse files
authored
fix: optimize parsing V3.1 documents by reducing GetLocation method allocation on hot path(#2748)
* chore: Refresh benchmarks * test: Add GHES Next descriptions * perf: ParsingContext.GetLocation * perf: Only load node location when needed * perf: Update GetLocation implementation
1 parent 3d07756 commit f690681

13 files changed

+332
-120
lines changed
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
```
22
3-
BenchmarkDotNet v0.15.8, Windows 11 (10.0.26200.7781/25H2/2025Update/HudsonValley2)
4-
11th Gen Intel Core i7-1185G7 3.00GHz, 1 CPU, 8 logical and 4 physical cores
3+
BenchmarkDotNet v0.15.8, Windows 11 (10.0.26200.7840/25H2/2025Update/HudsonValley2)
4+
AMD Ryzen 7 7800X3D 4.20GHz, 1 CPU, 16 logical and 8 physical cores
55
.NET SDK 8.0.418
66
[Host] : .NET 8.0.24 (8.0.24, 8.0.2426.7010), X64 RyuJIT x86-64-v4
77
ShortRun : .NET 8.0.24 (8.0.24, 8.0.2426.7010), X64 RyuJIT x86-64-v4
@@ -10,9 +10,11 @@ Job=ShortRun IterationCount=3 LaunchCount=1
1010
WarmupCount=3
1111
1212
```
13-
| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
14-
|------------- |-------------:|--------------:|-------------:|-----------:|-----------:|----------:|-------------:|
15-
| PetStoreYaml | 405.2 μs | 162.42 μs | 8.90 μs | 58.5938 | 11.7188 | - | 361.39 KB |
16-
| PetStoreJson | 173.0 μs | 23.21 μs | 1.27 μs | 36.1328 | 6.8359 | - | 223.53 KB |
17-
| GHESYaml | 951,103.8 μs | 629,262.79 μs | 34,492.02 μs | 60000.0000 | 22000.0000 | 4000.0000 | 345343.16 KB |
18-
| GHESJson | 435,425.1 μs | 88,170.37 μs | 4,832.92 μs | 33000.0000 | 12000.0000 | 2000.0000 | 206865.71 KB |
13+
| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
14+
|------------- |-------------:|--------------:|-------------:|-----------:|----------:|----------:|-------------:|
15+
| PetStoreYaml | 261.1 μs | 105.89 μs | 5.80 μs | 5.8594 | - | - | 361.38 KB |
16+
| PetStoreJson | 101.9 μs | 48.20 μs | 2.64 μs | 4.3945 | 0.9766 | - | 223.52 KB |
17+
| GHESYaml | 602,932.7 μs | 170,410.86 μs | 9,340.79 μs | 9000.0000 | 8000.0000 | 2000.0000 | 345336.55 KB |
18+
| GHESJson | 254,976.7 μs | 111,875.43 μs | 6,132.27 μs | 4000.0000 | 3000.0000 | 1000.0000 | 206858.06 KB |
19+
| GHESNextYaml | 729,602.0 μs | 357,122.29 μs | 19,575.08 μs | 13000.0000 | 9000.0000 | 2000.0000 | 541566.37 KB |
20+
| GHESNextJson | 378,208.4 μs | 109,458.45 μs | 5,999.79 μs | 8000.0000 | 5000.0000 | 1000.0000 | 406762.41 KB |
Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
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
2-
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,405.2 μs,162.42 μs,8.90 μs,58.5938,11.7188,0.0000,361.39 KB
3-
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,173.0 μs,23.21 μs,1.27 μs,36.1328,6.8359,0.0000,223.53 KB
4-
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,"951,103.8 μs","629,262.79 μs","34,492.02 μs",60000.0000,22000.0000,4000.0000,345343.16 KB
5-
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,"435,425.1 μs","88,170.37 μs","4,832.92 μs",33000.0000,12000.0000,2000.0000,206865.71 KB
1+
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
2+
PetStoreYaml;ShortRun;False;Default;Default;Default;Default;Default;Default;1111111111111111;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;261.1 μs;105.89 μs;5.80 μs;5.8594;0.0000;0.0000;361.38 KB
3+
PetStoreJson;ShortRun;False;Default;Default;Default;Default;Default;Default;1111111111111111;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;101.9 μs;48.20 μs;2.64 μs;4.3945;0.9766;0.0000;223.52 KB
4+
GHESYaml;ShortRun;False;Default;Default;Default;Default;Default;Default;1111111111111111;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;"602,932.7 μs";"170,410.86 μs";"9,340.79 μs";9000.0000;8000.0000;2000.0000;345336.55 KB
5+
GHESJson;ShortRun;False;Default;Default;Default;Default;Default;Default;1111111111111111;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;"254,976.7 μs";"111,875.43 μs";"6,132.27 μs";4000.0000;3000.0000;1000.0000;206858.06 KB
6+
GHESNextYaml;ShortRun;False;Default;Default;Default;Default;Default;Default;1111111111111111;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;"729,602.0 μs";"357,122.29 μs";"19,575.08 μs";13000.0000;9000.0000;2000.0000;541566.37 KB
7+
GHESNextJson;ShortRun;False;Default;Default;Default;Default;Default;Default;1111111111111111;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;"378,208.4 μs";"109,458.45 μs";"5,999.79 μs";8000.0000;5000.0000;1000.0000;406762.41 KB

performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.html

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html lang='en'>
33
<head>
44
<meta charset='utf-8' />
5-
<title>performance.Descriptions-20260219-140039</title>
5+
<title>performance.Descriptions-20260223-221211</title>
66

77
<style type="text/css">
88
table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
@@ -13,8 +13,8 @@
1313
</head>
1414
<body>
1515
<pre><code>
16-
BenchmarkDotNet v0.15.8, Windows 11 (10.0.26200.7781/25H2/2025Update/HudsonValley2)
17-
11th Gen Intel Core i7-1185G7 3.00GHz, 1 CPU, 8 logical and 4 physical cores
16+
BenchmarkDotNet v0.15.8, Windows 11 (10.0.26200.7840/25H2/2025Update/HudsonValley2)
17+
AMD Ryzen 7 7800X3D 4.20GHz, 1 CPU, 16 logical and 8 physical cores
1818
.NET SDK 8.0.418
1919
[Host] : .NET 8.0.24 (8.0.24, 8.0.2426.7010), X64 RyuJIT x86-64-v4
2020
ShortRun : .NET 8.0.24 (8.0.24, 8.0.2426.7010), X64 RyuJIT x86-64-v4
@@ -26,10 +26,12 @@
2626
<table>
2727
<thead><tr><th>Method</th><th>Mean </th><th>Error </th><th>StdDev</th><th>Gen0</th><th>Gen1</th><th>Gen2</th><th>Allocated</th>
2828
</tr>
29-
</thead><tbody><tr><td>PetStoreYaml</td><td>405.2 &mu;s</td><td>162.42 &mu;s</td><td>8.90 &mu;s</td><td>58.5938</td><td>11.7188</td><td>-</td><td>361.39 KB</td>
30-
</tr><tr><td>PetStoreJson</td><td>173.0 &mu;s</td><td>23.21 &mu;s</td><td>1.27 &mu;s</td><td>36.1328</td><td>6.8359</td><td>-</td><td>223.53 KB</td>
31-
</tr><tr><td>GHESYaml</td><td>951,103.8 &mu;s</td><td>629,262.79 &mu;s</td><td>34,492.02 &mu;s</td><td>60000.0000</td><td>22000.0000</td><td>4000.0000</td><td>345343.16 KB</td>
32-
</tr><tr><td>GHESJson</td><td>435,425.1 &mu;s</td><td>88,170.37 &mu;s</td><td>4,832.92 &mu;s</td><td>33000.0000</td><td>12000.0000</td><td>2000.0000</td><td>206865.71 KB</td>
29+
</thead><tbody><tr><td>PetStoreYaml</td><td>261.1 &mu;s</td><td>105.89 &mu;s</td><td>5.80 &mu;s</td><td>5.8594</td><td>-</td><td>-</td><td>361.38 KB</td>
30+
</tr><tr><td>PetStoreJson</td><td>101.9 &mu;s</td><td>48.20 &mu;s</td><td>2.64 &mu;s</td><td>4.3945</td><td>0.9766</td><td>-</td><td>223.52 KB</td>
31+
</tr><tr><td>GHESYaml</td><td>602,932.7 &mu;s</td><td>170,410.86 &mu;s</td><td>9,340.79 &mu;s</td><td>9000.0000</td><td>8000.0000</td><td>2000.0000</td><td>345336.55 KB</td>
32+
</tr><tr><td>GHESJson</td><td>254,976.7 &mu;s</td><td>111,875.43 &mu;s</td><td>6,132.27 &mu;s</td><td>4000.0000</td><td>3000.0000</td><td>1000.0000</td><td>206858.06 KB</td>
33+
</tr><tr><td>GHESNextYaml</td><td>729,602.0 &mu;s</td><td>357,122.29 &mu;s</td><td>19,575.08 &mu;s</td><td>13000.0000</td><td>9000.0000</td><td>2000.0000</td><td>541566.37 KB</td>
34+
</tr><tr><td>GHESNextJson</td><td>378,208.4 &mu;s</td><td>109,458.45 &mu;s</td><td>5,999.79 &mu;s</td><td>8000.0000</td><td>5000.0000</td><td>1000.0000</td><td>406762.41 KB</td>
3335
</tr></tbody></table>
3436
</body>
3537
</html>

performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.
Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
```
22
3-
BenchmarkDotNet v0.15.8, Windows 11 (10.0.26200.7781/25H2/2025Update/HudsonValley2)
4-
11th Gen Intel Core i7-1185G7 3.00GHz, 1 CPU, 8 logical and 4 physical cores
3+
BenchmarkDotNet v0.15.8, Windows 11 (10.0.26200.7840/25H2/2025Update/HudsonValley2)
4+
AMD Ryzen 7 7800X3D 4.20GHz, 1 CPU, 16 logical and 8 physical cores
55
.NET SDK 8.0.418
66
[Host] : .NET 8.0.24 (8.0.24, 8.0.2426.7010), X64 RyuJIT x86-64-v4
77
ShortRun : .NET 8.0.24 (8.0.24, 8.0.2426.7010), X64 RyuJIT x86-64-v4
@@ -10,33 +10,33 @@ Job=ShortRun IterationCount=3 LaunchCount=1
1010
WarmupCount=3
1111
1212
```
13-
| Method | Mean | Error | StdDev | Median | Gen0 | Allocated |
14-
|---------------------------- |-----------:|--------------:|-----------:|-----------:|-------:|----------:|
15-
| EmptyApiCallback | 7.107 ns | 27.5677 ns | 1.5111 ns | 6.733 ns | 0.0051 | 32 B |
16-
| EmptyApiComponents | 7.575 ns | 28.6866 ns | 1.5724 ns | 7.197 ns | 0.0179 | 112 B |
17-
| EmptyApiContact | 4.512 ns | 7.1450 ns | 0.3916 ns | 4.737 ns | 0.0076 | 48 B |
18-
| EmptyApiDiscriminator | 5.057 ns | 9.8280 ns | 0.5387 ns | 5.188 ns | 0.0076 | 48 B |
19-
| EmptyDocument | 512.914 ns | 1,179.4105 ns | 64.6475 ns | 490.147 ns | 0.1822 | 1144 B |
20-
| EmptyApiEncoding | 5.553 ns | 4.0716 ns | 0.2232 ns | 5.558 ns | 0.0127 | 80 B |
21-
| EmptyApiExample | 7.453 ns | 35.3590 ns | 1.9381 ns | 7.280 ns | 0.0115 | 72 B |
22-
| EmptyApiExternalDocs | 4.335 ns | 8.2705 ns | 0.4533 ns | 4.391 ns | 0.0064 | 40 B |
23-
| EmptyApiHeader | 4.809 ns | 1.0010 ns | 0.0549 ns | 4.783 ns | 0.0127 | 80 B |
24-
| EmptyApiInfo | 6.335 ns | 7.8701 ns | 0.4314 ns | 6.497 ns | 0.0127 | 80 B |
25-
| EmptyApiLicense | 4.646 ns | 11.5202 ns | 0.6315 ns | 4.866 ns | 0.0076 | 48 B |
26-
| EmptyApiLink | 5.075 ns | 11.0742 ns | 0.6070 ns | 4.839 ns | 0.0115 | 72 B |
27-
| EmptyApiMediaType | 5.995 ns | 37.5428 ns | 2.0578 ns | 4.808 ns | 0.0127 | 80 B |
28-
| EmptyApiOAuthFlow | 5.399 ns | 8.7086 ns | 0.4773 ns | 5.297 ns | 0.0102 | 64 B |
29-
| EmptyApiOAuthFlows | 5.644 ns | 17.9537 ns | 0.9841 ns | 5.634 ns | 0.0102 | 64 B |
30-
| EmptyApiOperation | 62.189 ns | 5.8945 ns | 0.3231 ns | 62.114 ns | 0.0598 | 376 B |
31-
| EmptyApiParameter | 5.664 ns | 3.3125 ns | 0.1816 ns | 5.668 ns | 0.0153 | 96 B |
32-
| EmptyApiPathItem | 5.656 ns | 18.7748 ns | 1.0291 ns | 5.920 ns | 0.0102 | 64 B |
33-
| EmptyApiPaths | 54.952 ns | 15.4066 ns | 0.8445 ns | 54.857 ns | 0.0395 | 248 B |
34-
| EmptyApiRequestBody | 4.035 ns | 1.9281 ns | 0.1057 ns | 4.044 ns | 0.0076 | 48 B |
35-
| EmptyApiResponse | 6.326 ns | 43.8105 ns | 2.4014 ns | 4.964 ns | 0.0102 | 64 B |
36-
| EmptyApiResponses | 57.107 ns | 72.4663 ns | 3.9721 ns | 55.247 ns | 0.0395 | 248 B |
37-
| EmptyApiSchema | 15.773 ns | 53.2697 ns | 2.9199 ns | 14.163 ns | 0.0663 | 416 B |
38-
| EmptyApiSecurityRequirement | 11.263 ns | 25.3799 ns | 1.3912 ns | 11.019 ns | 0.0166 | 104 B |
39-
| EmptyApiSecurityScheme | 5.531 ns | 0.7452 ns | 0.0408 ns | 5.544 ns | 0.0166 | 104 B |
40-
| EmptyApiServer | 4.612 ns | 6.7112 ns | 0.3679 ns | 4.789 ns | 0.0089 | 56 B |
41-
| EmptyApiServerVariable | 4.004 ns | 1.7788 ns | 0.0975 ns | 4.049 ns | 0.0076 | 48 B |
42-
| EmptyApiTag | 4.742 ns | 2.3792 ns | 0.1304 ns | 4.752 ns | 0.0115 | 72 B |
13+
| Method | Mean | Error | StdDev | Gen0 | Allocated |
14+
|---------------------------- |-----------:|------------:|----------:|-------:|----------:|
15+
| EmptyApiCallback | 2.544 ns | 2.0548 ns | 0.1126 ns | 0.0006 | 32 B |
16+
| EmptyApiComponents | 3.670 ns | 1.0618 ns | 0.0582 ns | 0.0022 | 112 B |
17+
| EmptyApiContact | 2.780 ns | 1.5098 ns | 0.0828 ns | 0.0010 | 48 B |
18+
| EmptyApiDiscriminator | 2.866 ns | 2.0794 ns | 0.1140 ns | 0.0010 | 48 B |
19+
| EmptyDocument | 288.287 ns | 164.5128 ns | 9.0175 ns | 0.0224 | 1144 B |
20+
| EmptyApiEncoding | 3.279 ns | 1.7411 ns | 0.0954 ns | 0.0016 | 80 B |
21+
| EmptyApiExample | 3.833 ns | 5.7132 ns | 0.3132 ns | 0.0014 | 72 B |
22+
| EmptyApiExternalDocs | 2.612 ns | 0.8470 ns | 0.0464 ns | 0.0008 | 40 B |
23+
| EmptyApiHeader | 3.371 ns | 2.0284 ns | 0.1112 ns | 0.0016 | 80 B |
24+
| EmptyApiInfo | 3.496 ns | 4.4784 ns | 0.2455 ns | 0.0016 | 80 B |
25+
| EmptyApiLicense | 3.192 ns | 5.8244 ns | 0.3193 ns | 0.0010 | 48 B |
26+
| EmptyApiLink | 3.317 ns | 1.5361 ns | 0.0842 ns | 0.0014 | 72 B |
27+
| EmptyApiMediaType | 3.531 ns | 3.6109 ns | 0.1979 ns | 0.0016 | 80 B |
28+
| EmptyApiOAuthFlow | 3.090 ns | 2.4010 ns | 0.1316 ns | 0.0013 | 64 B |
29+
| EmptyApiOAuthFlows | 3.251 ns | 3.1758 ns | 0.1741 ns | 0.0013 | 64 B |
30+
| EmptyApiOperation | 44.999 ns | 91.2661 ns | 5.0026 ns | 0.0075 | 376 B |
31+
| EmptyApiParameter | 3.871 ns | 5.3081 ns | 0.2910 ns | 0.0019 | 96 B |
32+
| EmptyApiPathItem | 3.152 ns | 2.3126 ns | 0.1268 ns | 0.0013 | 64 B |
33+
| EmptyApiPaths | 39.383 ns | 23.3311 ns | 1.2789 ns | 0.0049 | 248 B |
34+
| EmptyApiRequestBody | 3.048 ns | 2.9421 ns | 0.1613 ns | 0.0010 | 48 B |
35+
| EmptyApiResponse | 3.166 ns | 4.2306 ns | 0.2319 ns | 0.0013 | 64 B |
36+
| EmptyApiResponses | 37.056 ns | 17.1438 ns | 0.9397 ns | 0.0049 | 248 B |
37+
| EmptyApiSchema | 8.117 ns | 5.2729 ns | 0.2890 ns | 0.0083 | 416 B |
38+
| EmptyApiSecurityRequirement | 7.151 ns | 6.2278 ns | 0.3414 ns | 0.0021 | 104 B |
39+
| EmptyApiSecurityScheme | 3.708 ns | 5.3268 ns | 0.2920 ns | 0.0021 | 104 B |
40+
| EmptyApiServer | 2.923 ns | 0.4437 ns | 0.0243 ns | 0.0011 | 56 B |
41+
| EmptyApiServerVariable | 2.916 ns | 3.7008 ns | 0.2029 ns | 0.0010 | 48 B |
42+
| EmptyApiTag | 3.470 ns | 4.5358 ns | 0.2486 ns | 0.0014 | 72 B |

0 commit comments

Comments
 (0)