Skip to content

Commit b2e9063

Browse files
andrewjsaidcaptainsafia
authored andcommitted
Use new Dictionary AlternateLookup to avoid allocation in DictionaryJumpTable (#58305)
1 parent 4bfa27e commit b2e9063

File tree

2 files changed

+8
-4
lines changed

2 files changed

+8
-4
lines changed

src/Http/Routing/perf/Microbenchmarks/Matching/JumpTableMultipleEntryBenchmark.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void Setup()
2727

2828
for (var i = 0; i < _strings.Length; i++)
2929
{
30-
_segments[i] = new PathSegment(0, _strings[i].Length);
30+
_segments[i] = new PathSegment(1, _strings[i].Length - 2);
3131
}
3232

3333
var samples = new int[Count];
@@ -39,7 +39,9 @@ public void Setup()
3939
var entries = new List<(string text, int _)>();
4040
for (var i = 0; i < samples.Length; i++)
4141
{
42-
entries.Add((_strings[samples[i]], i));
42+
var sampleIndex = samples[i];
43+
var segment = _segments[sampleIndex];
44+
entries.Add((_strings[sampleIndex].Substring(segment.Start, segment.Length), i));
4345
}
4446

4547
_linearSearch = new LinearSearchJumpTable(0, -1, entries.ToArray());

src/Http/Routing/src/Matching/DictionaryJumpTable.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ internal sealed class DictionaryJumpTable : JumpTable
1212
private readonly int _defaultDestination;
1313
private readonly int _exitDestination;
1414
private readonly FrozenDictionary<string, int> _dictionary;
15+
private readonly FrozenDictionary<string, int>.AlternateLookup<ReadOnlySpan<char>> _lookup;
1516

1617
public DictionaryJumpTable(
1718
int defaultDestination,
@@ -22,6 +23,7 @@ public DictionaryJumpTable(
2223
_exitDestination = exitDestination;
2324

2425
_dictionary = entries.ToFrozenDictionary(e => e.text, e => e.destination, StringComparer.OrdinalIgnoreCase);
26+
_lookup = _dictionary.GetAlternateLookup<ReadOnlySpan<char>>();
2527
}
2628

2729
public override int GetDestination(string path, PathSegment segment)
@@ -31,8 +33,8 @@ public override int GetDestination(string path, PathSegment segment)
3133
return _exitDestination;
3234
}
3335

34-
var text = path.Substring(segment.Start, segment.Length);
35-
if (_dictionary.TryGetValue(text, out var destination))
36+
var text = path.AsSpan(segment.Start, segment.Length);
37+
if (_lookup.TryGetValue(text, out var destination))
3638
{
3739
return destination;
3840
}

0 commit comments

Comments
 (0)