Skip to content

Add #nullable enable to UriHelpers#8166

Merged
andrewlock merged 1 commit intomasterfrom
andrew/aspnetcore-perf/add-nullability-to-uri-helpers
Feb 11, 2026
Merged

Add #nullable enable to UriHelpers#8166
andrewlock merged 1 commit intomasterfrom
andrew/aspnetcore-perf/add-nullability-to-uri-helpers

Conversation

@andrewlock
Copy link
Member

Summary of changes

Adds #nullable enable to UriHelpers and fix usages

Reason for change

I was working with the file, so decided to cleanup

Implementation details

Add #nullable enable, fix the complaints

Test coverage

I'm assuming already has coverage

@andrewlock andrewlock requested review from a team as code owners February 6, 2026 13:35
@andrewlock andrewlock added the type:cleanup Minor code clean up label Feb 6, 2026
@andrewlock andrewlock changed the title Add nullablity to UriHelpers Add #nullable enable to UriHelpers Feb 6, 2026
try
{
var resourceUrl = UriHelpers.GetCleanUriPath(data.Path).ToLowerInvariant();
var resourceUrl = data.Path is null ? string.Empty : UriHelpers.GetCleanUriPath(data.Path).ToLowerInvariant();
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is technically a change in behaviour, and "" is a poor fallback, but previously it would just throw so open to alternative suggestions 🤷‍♂️

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay so looking at the other implementations we were the only ones who were throwing here and not creating a span. The other implementations all create a span, but then they mainly differ from there in the tag data generated for the inferred span they create.

It looks like both Java/JavaScript would concatenate the the name with the literal null string for the http.url so something like "domainnull"
Go uses an empty string
Python skips it if it is null and won't include the tag

So with this we'd match Go. I'd say that is good enough, the RFC doesn't specify what to do in this case.

This comment was marked as duplicate.

This comment was marked as duplicate.

This comment was marked as duplicate.

Copy link
Member

@lucaspimentel lucaspimentel Feb 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

concatenate the the name with the literal null string for the http.url so something like "domainnull"

that sounds like a bug 😅

or maybe you're misreading the code and that's how they coalesce null values? like path ?? "null" in C#?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the RFC doesn't specify what to do in this case

we should fix that?

&& absolutePath.StartsWith(virtualPathToRemove, StringComparison.OrdinalIgnoreCase)
&& absolutePath.Length > virtualPathToRemove.Length
&& absolutePath[virtualPathToRemove.Length] == '/';
var prefixLength = !StringUtil.IsNullOrEmpty(virtualPathToRemove)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The switch from hasPrefix to prefixLength here is because otherwise the compiler couldn't subsequently reason about the fact that hasPrefix==true implies virtualPathToRemove != null. Doing it in one here resolves the issue without needing !

@pr-commenter
Copy link

pr-commenter bot commented Feb 6, 2026

Benchmarks

Benchmark execution time: 2026-02-06 14:17:25

Comparing candidate commit 3a3b307 in PR branch andrew/aspnetcore-perf/add-nullability-to-uri-helpers with baseline commit c0dad86 in branch master.

Found 11 performance improvements and 2 performance regressions! Performance is the same for 154 metrics, 25 unstable metrics.

scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces net6.0

  • 🟥 execution_time [+103.435ms; +103.840ms] or [+102.310%; +102.710%]

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleSimpleBody netcoreapp3.1

  • 🟥 execution_time [+13.970ms; +20.387ms] or [+7.052%; +10.291%]

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorMoreComplexBody net6.0

  • 🟩 execution_time [-16.514ms; -11.018ms] or [-7.738%; -5.163%]

scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs net6.0

  • 🟩 execution_time [-25.084ms; -24.475ms] or [-12.288%; -11.990%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces netcoreapp3.1

  • 🟩 execution_time [-74.434ms; -73.352ms] or [-33.926%; -33.432%]
  • 🟩 throughput [+259.633op/s; +267.936op/s] or [+18.738%; +19.337%]

scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice netcoreapp3.1

  • 🟩 execution_time [-998.162µs; -746.087µs] or [-34.815%; -26.023%]

scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice net472

  • 🟩 execution_time [-244.190µs; -240.370µs] or [-8.705%; -8.568%]
  • 🟩 throughput [+33.417op/s; +33.976op/s] or [+9.374%; +9.531%]

scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice net6.0

  • 🟩 execution_time [-225.729µs; -196.338µs] or [-10.189%; -8.863%]
  • 🟩 throughput [+44.136op/s; +51.080op/s] or [+9.778%; +11.316%]

scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog net6.0

  • 🟩 execution_time [-18.153ms; -12.808ms] or [-8.486%; -5.987%]

scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes net6.0

  • 🟩 execution_time [-17.935ms; -16.363ms] or [-8.235%; -7.513%]

@dd-trace-dotnet-ci-bot
Copy link

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing This PR (8166) and master.

⚠️ Potential regressions detected

FakeDbCommand

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration68.30 ± (68.33 - 68.58) ms77.11 ± (77.07 - 77.52) ms+12.9%❌⬆️
.NET Framework 4.8 - Bailout
duration72.05 ± (71.98 - 72.20) ms81.98 ± (81.94 - 82.37) ms+13.8%❌⬆️
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1025.15 ± (1027.07 - 1033.25) ms1098.97 ± (1098.53 - 1104.53) ms+7.2%❌⬆️
Full Metrics Comparison

FakeDbCommand

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration68.30 ± (68.33 - 68.58) ms77.11 ± (77.07 - 77.52) ms+12.9%❌⬆️
.NET Framework 4.8 - Bailout
duration72.05 ± (71.98 - 72.20) ms81.98 ± (81.94 - 82.37) ms+13.8%❌⬆️
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1025.15 ± (1027.07 - 1033.25) ms1098.97 ± (1098.53 - 1104.53) ms+7.2%❌⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms22.46 ± (22.44 - 22.48) ms24.39 ± (24.32 - 24.45) ms+8.6%✅⬆️
process.time_to_main_ms86.82 ± (86.67 - 86.96) ms99.73 ± (99.48 - 99.98) ms+14.9%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed15.51 ± (15.51 - 15.52) MB15.51 ± (15.50 - 15.51) MB-0.0%
runtime.dotnet.threads.count12 ± (12 - 12)12 ± (12 - 12)+0.0%
.NET Core 3.1 - Bailout
process.internal_duration_ms22.40 ± (22.37 - 22.43) ms24.21 ± (24.14 - 24.27) ms+8.1%✅⬆️
process.time_to_main_ms87.84 ± (87.73 - 87.95) ms101.09 ± (100.84 - 101.34) ms+15.1%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed15.55 ± (15.55 - 15.56) MB15.56 ± (15.55 - 15.56) MB+0.0%✅⬆️
runtime.dotnet.threads.count13 ± (13 - 13)13 ± (13 - 13)+0.0%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms255.49 ± (251.86 - 259.12) ms286.48 ± (284.22 - 288.74) ms+12.1%✅⬆️
process.time_to_main_ms503.66 ± (503.12 - 504.20) ms552.50 ± (551.45 - 553.56) ms+9.7%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed53.23 ± (53.20 - 53.25) MB53.26 ± (53.24 - 53.29) MB+0.1%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)-0.0%
.NET 6 - Baseline
process.internal_duration_ms21.04 ± (21.01 - 21.06) ms22.96 ± (22.90 - 23.03) ms+9.2%✅⬆️
process.time_to_main_ms75.06 ± (74.92 - 75.21) ms86.90 ± (86.63 - 87.17) ms+15.8%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed15.23 ± (15.23 - 15.23) MB15.22 ± (15.22 - 15.22) MB-0.1%
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 6 - Bailout
process.internal_duration_ms20.87 ± (20.84 - 20.90) ms22.68 ± (22.62 - 22.75) ms+8.7%✅⬆️
process.time_to_main_ms75.77 ± (75.68 - 75.86) ms86.93 ± (86.71 - 87.16) ms+14.7%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed15.36 ± (15.36 - 15.37) MB15.34 ± (15.33 - 15.34) MB-0.2%
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms253.80 ± (252.89 - 254.71) ms274.33 ± (272.59 - 276.07) ms+8.1%✅⬆️
process.time_to_main_ms481.12 ± (480.50 - 481.75) ms524.59 ± (523.80 - 525.38) ms+9.0%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed53.98 ± (53.95 - 54.01) MB53.97 ± (53.95 - 54.00) MB-0.0%
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)+0.0%
.NET 8 - Baseline
process.internal_duration_ms19.24 ± (19.21 - 19.26) ms20.96 ± (20.90 - 21.02) ms+9.0%✅⬆️
process.time_to_main_ms73.87 ± (73.76 - 73.98) ms85.37 ± (85.17 - 85.57) ms+15.6%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed12.27 ± (12.27 - 12.28) MB12.27 ± (12.26 - 12.27) MB-0.1%
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 8 - Bailout
process.internal_duration_ms19.20 ± (19.17 - 19.23) ms20.89 ± (20.84 - 20.95) ms+8.8%✅⬆️
process.time_to_main_ms75.08 ± (75.00 - 75.16) ms86.53 ± (86.33 - 86.74) ms+15.3%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed12.34 ± (12.33 - 12.35) MB12.31 ± (12.30 - 12.31) MB-0.3%
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms181.20 ± (180.26 - 182.14) ms201.23 ± (200.24 - 202.22) ms+11.1%✅⬆️
process.time_to_main_ms461.65 ± (461.02 - 462.29) ms506.63 ± (505.59 - 507.67) ms+9.7%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed41.23 ± (41.20 - 41.25) MB41.60 ± (41.55 - 41.65) MB+0.9%✅⬆️
runtime.dotnet.threads.count27 ± (27 - 27)27 ± (27 - 27)+0.0%✅⬆️

HttpMessageHandler

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration193.79 ± (193.64 - 194.38) ms203.14 ± (203.36 - 204.85) ms+4.8%✅⬆️
.NET Framework 4.8 - Bailout
duration197.11 ± (197.02 - 197.59) ms207.01 ± (207.55 - 209.00) ms+5.0%✅⬆️
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1145.42 ± (1145.20 - 1150.97) ms1195.38 ± (1197.80 - 1207.20) ms+4.4%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms193.39 ± (192.93 - 193.85) ms209.17 ± (208.11 - 210.22) ms+8.2%✅⬆️
process.time_to_main_ms89.41 ± (89.12 - 89.70) ms96.13 ± (95.70 - 96.55) ms+7.5%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed20.85 ± (20.83 - 20.88) MB20.59 ± (20.57 - 20.60) MB-1.3%
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)+1.8%✅⬆️
.NET Core 3.1 - Bailout
process.internal_duration_ms191.60 ± (191.32 - 191.88) ms206.20 ± (205.28 - 207.12) ms+7.6%✅⬆️
process.time_to_main_ms90.28 ± (90.12 - 90.45) ms96.24 ± (95.83 - 96.64) ms+6.6%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed20.78 ± (20.76 - 20.81) MB20.65 ± (20.63 - 20.66) MB-0.7%
runtime.dotnet.threads.count21 ± (21 - 21)21 ± (21 - 21)+1.0%✅⬆️
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms443.88 ± (441.58 - 446.18) ms458.06 ± (455.14 - 460.98) ms+3.2%✅⬆️
process.time_to_main_ms509.20 ± (508.55 - 509.84) ms537.87 ± (536.83 - 538.91) ms+5.6%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed63.62 ± (63.51 - 63.72) MB63.14 ± (62.99 - 63.30) MB-0.7%
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 30)+0.2%✅⬆️
.NET 6 - Baseline
process.internal_duration_ms196.37 ± (196.07 - 196.67) ms208.79 ± (208.08 - 209.50) ms+6.3%✅⬆️
process.time_to_main_ms77.04 ± (76.81 - 77.26) ms81.93 ± (81.65 - 82.21) ms+6.4%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed20.96 ± (20.93 - 20.99) MB20.77 ± (20.75 - 20.78) MB-0.9%
runtime.dotnet.threads.count19 ± (19 - 19)20 ± (20 - 20)+1.0%✅⬆️
.NET 6 - Bailout
process.internal_duration_ms195.41 ± (195.11 - 195.70) ms207.74 ± (207.14 - 208.33) ms+6.3%✅⬆️
process.time_to_main_ms78.00 ± (77.86 - 78.14) ms82.66 ± (82.42 - 82.89) ms+6.0%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed21.02 ± (20.99 - 21.05) MB20.88 ± (20.87 - 20.90) MB-0.7%
runtime.dotnet.threads.count20 ± (20 - 21)21 ± (21 - 21)+0.6%✅⬆️
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms463.92 ± (462.32 - 465.51) ms479.90 ± (477.47 - 482.32) ms+3.4%✅⬆️
process.time_to_main_ms487.27 ± (486.58 - 487.96) ms507.89 ± (506.84 - 508.94) ms+4.2%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed63.13 ± (63.02 - 63.24) MB62.58 ± (62.48 - 62.69) MB-0.9%
runtime.dotnet.threads.count30 ± (30 - 30)30 ± (30 - 30)+0.5%✅⬆️
.NET 8 - Baseline
process.internal_duration_ms194.33 ± (194.00 - 194.66) ms208.13 ± (207.39 - 208.88) ms+7.1%✅⬆️
process.time_to_main_ms77.18 ± (76.98 - 77.38) ms81.07 ± (80.76 - 81.37) ms+5.0%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.32 ± (16.30 - 16.34) MB16.18 ± (16.16 - 16.20) MB-0.9%
runtime.dotnet.threads.count19 ± (19 - 19)19 ± (19 - 19)+1.1%✅⬆️
.NET 8 - Bailout
process.internal_duration_ms193.13 ± (192.82 - 193.45) ms209.88 ± (209.13 - 210.64) ms+8.7%✅⬆️
process.time_to_main_ms77.91 ± (77.76 - 78.06) ms83.35 ± (83.10 - 83.61) ms+7.0%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.42 ± (16.39 - 16.45) MB16.29 ± (16.27 - 16.30) MB-0.8%
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)+1.0%✅⬆️
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms371.48 ± (370.24 - 372.72) ms455.32 ± (447.94 - 462.70) ms+22.6%✅⬆️
process.time_to_main_ms468.84 ± (468.24 - 469.44) ms493.84 ± (492.88 - 494.80) ms+5.3%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed52.98 ± (52.94 - 53.01) MB55.13 ± (55.10 - 55.17) MB+4.1%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)-0.2%
Comparison explanation

Execution-time benchmarks measure the whole time it takes to execute a program, and are intended to measure the one-off costs. Cases where the execution time results for the PR are worse than latest master results are highlighted in **red**. The following thresholds were used for comparing the execution times:

  • Welch test with statistical test for significance of 5%
  • Only results indicating a difference greater than 5% and 5 ms are considered.

Note that these results are based on a single point-in-time result for each branch. For full results, see the dashboard.

Graphs show the p99 interval based on the mean and StdDev of the test run, as well as the mean value of the run (shown as a diamond below the graph).

Duration charts
FakeDbCommand (.NET Framework 4.8)
gantt
    title Execution time (ms) FakeDbCommand (.NET Framework 4.8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8166) - mean (77ms)  : 74, 81
    master - mean (68ms)  : 67, 70

    section Bailout
    This PR (8166) - mean (82ms)  : crit, 79, 85
    master - mean (72ms)  : 71, 73

    section CallTarget+Inlining+NGEN
    This PR (8166) - mean (1,102ms)  : crit, 1059, 1144
    master - mean (1,030ms)  : 986, 1074

Loading
FakeDbCommand (.NET Core 3.1)
gantt
    title Execution time (ms) FakeDbCommand (.NET Core 3.1)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8166) - mean (132ms)  : 127, 137
    master - mean (115ms)  : 113, 118

    section Bailout
    This PR (8166) - mean (133ms)  : crit, 129, 137
    master - mean (116ms)  : 114, 118

    section CallTarget+Inlining+NGEN
    This PR (8166) - mean (878ms)  : crit, 834, 922
    master - mean (797ms)  : 742, 852

Loading
FakeDbCommand (.NET 6)
gantt
    title Execution time (ms) FakeDbCommand (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8166) - mean (117ms)  : 112, 123
    master - mean (101ms)  : 99, 104

    section Bailout
    This PR (8166) - mean (117ms)  : crit, 114, 120
    master - mean (102ms)  : 101, 103

    section CallTarget+Inlining+NGEN
    This PR (8166) - mean (837ms)  : crit, 803, 872
    master - mean (776ms)  : 755, 797

Loading
FakeDbCommand (.NET 8)
gantt
    title Execution time (ms) FakeDbCommand (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8166) - mean (115ms)  : 112, 119
    master - mean (100ms)  : 97, 102

    section Bailout
    This PR (8166) - mean (116ms)  : crit, 112, 120
    master - mean (101ms)  : 99, 102

    section CallTarget+Inlining+NGEN
    This PR (8166) - mean (752ms)  : crit, 728, 776
    master - mean (686ms)  : 673, 698

Loading
HttpMessageHandler (.NET Framework 4.8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET Framework 4.8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8166) - mean (204ms)  : 193, 215
    master - mean (194ms)  : 190, 198

    section Bailout
    This PR (8166) - mean (208ms)  : 198, 219
    master - mean (197ms)  : 195, 200

    section CallTarget+Inlining+NGEN
    This PR (8166) - mean (1,203ms)  : 1130, 1275
    master - mean (1,148ms)  : 1107, 1189

Loading
HttpMessageHandler (.NET Core 3.1)
gantt
    title Execution time (ms) HttpMessageHandler (.NET Core 3.1)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8166) - mean (318ms)  : 292, 344
    master - mean (292ms)  : 284, 300

    section Bailout
    This PR (8166) - mean (313ms)  : crit, 296, 330
    master - mean (291ms)  : 287, 295

    section CallTarget+Inlining+NGEN
    This PR (8166) - mean (1,041ms)  : 995, 1086
    master - mean (991ms)  : 953, 1029

Loading
HttpMessageHandler (.NET 6)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8166) - mean (302ms)  : 289, 315
    master - mean (282ms)  : 278, 287

    section Bailout
    This PR (8166) - mean (300ms)  : crit, 287, 314
    master - mean (282ms)  : 279, 286

    section CallTarget+Inlining+NGEN
    This PR (8166) - mean (1,027ms)  : 982, 1072
    master - mean (988ms)  : 950, 1026

Loading
HttpMessageHandler (.NET 8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8166) - mean (301ms)  : 285, 316
    master - mean (282ms)  : 277, 287

    section Bailout
    This PR (8166) - mean (305ms)  : crit, 291, 319
    master - mean (281ms)  : 277, 286

    section CallTarget+Inlining+NGEN
    This PR (8166) - mean (990ms)  : crit, 879, 1100
    master - mean (873ms)  : 849, 896

Loading

Copy link
Collaborator

@bouwkast bouwkast left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, just the one comment on the inferred span, but I think what we have with this change is more ideal and there isn't a consistent approach so I think the change in behavior is not important.

Copy link
Collaborator

@NachoEchevarria NachoEchevarria left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@andrewlock andrewlock merged commit fe2ec1a into master Feb 11, 2026
145 checks passed
@andrewlock andrewlock deleted the andrew/aspnetcore-perf/add-nullability-to-uri-helpers branch February 11, 2026 10:41
@github-actions github-actions bot added this to the vNext-v3 milestone Feb 11, 2026
@andrewlock andrewlock added the area:builds project files, build scripts, pipelines, versioning, releases, packages label Feb 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:builds project files, build scripts, pipelines, versioning, releases, packages type:cleanup Minor code clean up

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants