Skip to content

Commit c442e07

Browse files
committed
perf: ParsingContext.GetLocation
1 parent a7242ac commit c442e07

File tree

5 files changed

+51
-24
lines changed

5 files changed

+51
-24
lines changed

performance/benchmark/BenchmarkDotNet.Artifacts/results/performance.Descriptions-report-github.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +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 | 279.0 μs | 272.39 μs | 14.93 μs | 5.8594 | - | - | 361.38 KB |
16-
| PetStoreJson | 102.9 μs | 17.98 μs | 0.99 μs | 4.3945 | 0.9766 | - | 223.52 KB |
17-
| GHESYaml | 635,487.8 μs | 279,254.76 μs | 15,306.90 μs | 9000.0000 | 8000.0000 | 2000.0000 | 345336.55 KB |
18-
| GHESJson | 277,064.1 μs | 164,049.38 μs | 8,992.10 μs | 4000.0000 | 3000.0000 | 1000.0000 | 206858.06 KB |
19-
| GHESNextYaml | 4,479,297.6 μs | 1,561,306.63 μs | 85,580.48 μs | 191000.0000 | 11000.0000 | 3000.0000 | 9268440.43 KB |
20-
| GHESNextJson | 3,305,679.1 μs | 679,209.31 μs | 37,229.75 μs | 186000.0000 | 17000.0000 | 1000.0000 | 9133635.6 KB |
13+
| Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
14+
|------------- |---------------:|--------------:|-------------:|------------:|-----------:|----------:|--------------:|
15+
| PetStoreYaml | 285.1 μs | 467.14 μs | 25.61 μs | 5.8594 | - | - | 361.38 KB |
16+
| PetStoreJson | 110.2 μs | 75.79 μs | 4.15 μs | 4.3945 | 0.9766 | - | 223.52 KB |
17+
| GHESYaml | 687,947.0 μs | 659,775.92 μs | 36,164.54 μs | 9000.0000 | 8000.0000 | 2000.0000 | 345336.55 KB |
18+
| GHESJson | 270,583.7 μs | 134,378.11 μs | 7,365.72 μs | 4000.0000 | 3000.0000 | 1000.0000 | 206858.06 KB |
19+
| GHESNextYaml | 3,443,318.8 μs | 127,519.37 μs | 6,989.77 μs | 160000.0000 | 11000.0000 | 3000.0000 | 7701975.75 KB |
20+
| GHESNextJson | 2,954,715.0 μs | 327,737.12 μs | 17,964.38 μs | 155000.0000 | 19000.0000 | 1000.0000 | 7567167.19 KB |
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
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;279.0 μs;272.39 μs;14.93 μ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;102.9 μs;17.98 μs;0.99 μ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;"635,487.8 μs";"279,254.76 μs";"15,306.90 μ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;"277,064.1 μs";"164,049.38 μs";"8,992.10 μ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;"4,479,297.6 μs";"1,561,306.63 μs";"85,580.48 μs";191000.0000;11000.0000;3000.0000;9268440.43 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;"3,305,679.1 μs";"679,209.31 μs";"37,229.75 μs";186000.0000;17000.0000;1000.0000;9133635.6 KB
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;285.1 μs;467.14 μs;25.61 μ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;110.2 μs;75.79 μs;4.15 μ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;"687,947.0 μs";"659,775.92 μs";"36,164.54 μ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;"270,583.7 μs";"134,378.11 μs";"7,365.72 μ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;"3,443,318.8 μs";"127,519.37 μs";"6,989.77 μs";160000.0000;11000.0000;3000.0000;7701975.75 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;"2,954,715.0 μs";"327,737.12 μs";"17,964.38 μs";155000.0000;19000.0000;1000.0000;7567167.19 KB

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

Lines changed: 8 additions & 8 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-20260222-170425</title>
5+
<title>performance.Descriptions-20260222-171957</title>
66

77
<style type="text/css">
88
table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
@@ -24,14 +24,14 @@
2424
</code></pre>
2525

2626
<table>
27-
<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>
27+
<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>279.0 &mu;s</td><td>272.39 &mu;s</td><td>14.93 &mu;s</td><td>5.8594</td><td>-</td><td>-</td><td>361.38 KB</td>
30-
</tr><tr><td>PetStoreJson</td><td>102.9 &mu;s</td><td>17.98 &mu;s</td><td>0.99 &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>635,487.8 &mu;s</td><td>279,254.76 &mu;s</td><td>15,306.90 &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>277,064.1 &mu;s</td><td>164,049.38 &mu;s</td><td>8,992.10 &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>4,479,297.6 &mu;s</td><td>1,561,306.63 &mu;s</td><td>85,580.48 &mu;s</td><td>191000.0000</td><td>11000.0000</td><td>3000.0000</td><td>9268440.43 KB</td>
34-
</tr><tr><td>GHESNextJson</td><td>3,305,679.1 &mu;s</td><td>679,209.31 &mu;s</td><td>37,229.75 &mu;s</td><td>186000.0000</td><td>17000.0000</td><td>1000.0000</td><td>9133635.6 KB</td>
29+
</thead><tbody><tr><td>PetStoreYaml</td><td>285.1 &mu;s</td><td>467.14 &mu;s</td><td>25.61 &mu;s</td><td>5.8594</td><td>-</td><td>-</td><td>361.38 KB</td>
30+
</tr><tr><td>PetStoreJson</td><td>110.2 &mu;s</td><td>75.79 &mu;s</td><td>4.15 &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>687,947.0 &mu;s</td><td>659,775.92 &mu;s</td><td>36,164.54 &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>270,583.7 &mu;s</td><td>134,378.11 &mu;s</td><td>7,365.72 &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>3,443,318.8 &mu;s</td><td>127,519.37 &mu;s</td><td>6,989.77 &mu;s</td><td>160000.0000</td><td>11000.0000</td><td>3000.0000</td><td>7701975.75 KB</td>
34+
</tr><tr><td>GHESNextJson</td><td>2,954,715.0 &mu;s</td><td>327,737.12 &mu;s</td><td>17,964.38 &mu;s</td><td>155000.0000</td><td>19000.0000</td><td>1000.0000</td><td>7567167.19 KB</td>
3535
</tr></tbody></table>
3636
</body>
3737
</html>

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

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

src/Microsoft.OpenApi/Reader/ParsingContext.cs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Linq;
7+
using System.Text;
78
using System.Text.Json.Nodes;
89
using Microsoft.OpenApi.Reader.V2;
910
using Microsoft.OpenApi.Reader.V3;
@@ -174,7 +175,33 @@ public void EndObject()
174175
/// </summary>
175176
public string GetLocation()
176177
{
177-
return "#/" + string.Join("/", _currentLocation.Reverse().Select(s => s.Replace("~", "~0").Replace("/", "~1")).ToArray());
178+
if (_currentLocation.Count == 0)
179+
{
180+
return "#/";
181+
}
182+
183+
var sb = new StringBuilder("#/");
184+
var segments = _currentLocation.ToArray();
185+
186+
for (int i = segments.Length - 1; i >= 0; i--)
187+
{
188+
var segment = segments[i];
189+
190+
// Escape ~ and / per RFC 6901
191+
if (segment.Contains("~") || segment.Contains("/"))
192+
{
193+
segment = segment.Replace("~", "~0").Replace("/", "~1");
194+
}
195+
196+
sb.Append(segment);
197+
198+
if (i > 0)
199+
{
200+
sb.Append('/');
201+
}
202+
}
203+
204+
return sb.ToString();
178205
}
179206

180207
/// <summary>

0 commit comments

Comments
 (0)