Skip to content

Use SpanCharSplitter for parsing source link URLs#8349

Merged
andrewlock merged 3 commits into
masterfrom
andrew/analyzers/use-stringsplitter
Mar 25, 2026
Merged

Use SpanCharSplitter for parsing source link URLs#8349
andrewlock merged 3 commits into
masterfrom
andrew/analyzers/use-stringsplitter

Conversation

@andrewlock

@andrewlock andrewlock commented Mar 20, 2026

Copy link
Copy Markdown
Member

Summary of changes

  • Add unit tests for SourceLinkUrlParser implementations
  • Refactor implementations to reduce allocations (by using SpanCharSplitter instead of String.Split()

Reason for change

@lucaspimentel flagged this as an option in #8332, as it will reduce allocations. As this is something we do for every app, it makes sense to optimize.

Implementation details

  • Had 🤖 write some unit tests for the current behaviour
  • Had 🤖 replace existing Split usages with SpanCharSplitter
  • Review and tweak

There's still some allocations we could potentially remove, by doing some dangerous stuff (like we do in UriHelpers, to avoid hitting AbsolutePath etc) but I don't know that the payoff is worth it here. Fewer allocations is better, but it's not worth going overboard IMO.

Test coverage

  • The unit tests pass before and after the changes
  • Benchmarked just one of the implementations before and after, but you get the idea I think
Method Runtime Mean Allocated
TryParseSourceLinkUrl_Original .NET 10.0 2,929.4 ns 2552 B
TryParseSourceLinkUrl_Updated .NET 10.0 400.4 ns 240 B
TryParseSourceLinkUrl_Original .NET 6.0 2,540.5 ns 2584 B
TryParseSourceLinkUrl_Updated .NET 6.0 376.1 ns 240 B
TryParseSourceLinkUrl_Original .NET Core 3.1 3,550.8 ns 2672 B
TryParseSourceLinkUrl_Updated .NET Core 3.1 450.3 ns 456 B
TryParseSourceLinkUrl_Original .NET Framework 4.8 3,875.2 ns 4036 B
TryParseSourceLinkUrl_Updated .NET Framework 4.8 708.1 ns 578 B
Benchmark code

[MemoryDiagnoser, GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory), CategoriesColumn]
public class UriHelperBenchmarks
{
    private string _sha;
    private string _repoUrl;
    private Uri _uri;
    private AzureDevOpsSourceLinkUrlParser _parser;
    private AzureDevOpsSourceLinkUrlParserOriginal _parser2;

    [GlobalSetup]
    public void GlobalSetup()
    {
        _parser = new AzureDevOpsSourceLinkUrlParser();
        _parser2 = new AzureDevOpsSourceLinkUrlParserOriginal();
        _uri = new Uri("https://dev.azure.com/org/proj/_apis/git/repositories/example.shopping.api/items?api-version=1.0&versionType=commit&version=0e4d29442102e6cef1c271025d513c8b2187bcd6&path=/*");
    }

    [GlobalCleanup]
    public void GlobalCleanup()
    {
        _sha = null;
        _repoUrl = null;
    }

    [Benchmark(Baseline = true)]
    public bool TryParseSourceLinkUrl_Original()
    {
        return _parser2.TryParseSourceLinkUrl(_uri, out _sha, out _repoUrl);
    }

    [Benchmark]
    public bool TryParseSourceLinkUrl_Updated()
    {
        return _parser.TryParseSourceLinkUrl(_uri, out _sha, out _repoUrl);
    }
}

Other details

Stacked on #8332 for simplicity

@andrewlock andrewlock requested a review from a team as a code owner March 20, 2026 15:02
@andrewlock andrewlock requested a review from a team as a code owner March 20, 2026 15:02
@andrewlock andrewlock added type:performance Performance, speed, latency, resource usage (CPU, memory) AI Generated Largely based on code generated by an AI or LLM. This label is the same across all dd-trace-* repos labels Mar 20, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9d8afdda3d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@pr-commenter

pr-commenter Bot commented Mar 20, 2026

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2026-03-25 12:35:32

Comparing candidate commit c5501e0 in PR branch andrew/analyzers/use-stringsplitter with baseline commit 6aadb93 in branch master.

Found 9 performance improvements and 6 performance regressions! Performance is the same for 259 metrics, 14 unstable metrics.

Explanation

This is an A/B test comparing a candidate commit's performance against that of a baseline commit. Performance changes are noted in the tables below as:

  • 🟩 = significantly better candidate vs. baseline
  • 🟥 = significantly worse candidate vs. baseline

We compute a confidence interval (CI) over the relative difference of means between metrics from the candidate and baseline commits, considering the baseline as the reference.

If the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD), the change is considered significant.

Feel free to reach out to #apm-benchmarking-platform on Slack if you have any questions.

More details about the CI and significant changes

You can imagine this CI as a range of values that is likely to contain the true difference of means between the candidate and baseline commits.

CIs of the difference of means are often centered around 0%, because often changes are not that big:

---------------------------------(------|---^--------)-------------------------------->
                              -0.6%    0%  0.3%     +1.2%
                                 |          |        |
         lower bound of the CI --'          |        |
sample mean (center of the CI) -------------'        |
         upper bound of the CI ----------------------'

As described above, a change is considered significant if the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD).

For instance, for an execution time metric, this confidence interval indicates a significantly worse performance:

----------------------------------------|---------|---(---------^---------)---------->
                                       0%        1%  1.3%      2.2%      3.1%
                                                  |   |         |         |
       significant impact threshold --------------'   |         |         |
                      lower bound of CI --------------'         |         |
       sample mean (center of the CI) --------------------------'         |
                      upper bound of CI ----------------------------------'

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

  • 🟩 execution_time [-79.360ms; -79.280ms] or [-38.535%; -38.496%]

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

  • 🟥 execution_time [+14.036ms; +18.635ms] or [+7.063%; +9.377%]

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

  • 🟥 execution_time [+15.205ms; +21.618ms] or [+7.809%; +11.102%]

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

  • 🟥 execution_time [+18.189ms; +24.279ms] or [+9.307%; +12.423%]

scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs netcoreapp3.1

  • 🟥 execution_time [+20.013ms; +21.162ms] or [+11.054%; +11.688%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net472

  • 🟩 execution_time [-27.222ms; -20.806ms] or [-12.096%; -9.245%]

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

  • 🟩 execution_time [-166.174µs; -117.639µs] or [-7.960%; -5.635%]
  • 🟩 throughput [+29.490op/s; +39.989op/s] or [+6.153%; +8.344%]

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

  • 🟥 throughput [-185.440op/s; -151.373op/s] or [-43.595%; -35.587%]

scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark netcoreapp3.1

  • 🟩 allocated_mem [-19.761KB; -19.733KB] or [-7.189%; -7.179%]

scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog netcoreapp3.1

  • 🟩 execution_time [-29.993ms; -26.450ms] or [-14.863%; -13.107%]

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

  • 🟩 throughput [+10136.936op/s; +11146.512op/s] or [+5.206%; +5.724%]

scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan net472

  • 🟩 throughput [+54064.106op/s; +59136.861op/s] or [+5.030%; +5.502%]

scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan netcoreapp3.1

  • 🟥 execution_time [+11.760ms; +17.154ms] or [+5.862%; +8.550%]

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

  • 🟩 execution_time [-15.128ms; -12.275ms] or [-7.082%; -5.746%]

@dd-trace-dotnet-ci-bot

dd-trace-dotnet-ci-bot Bot commented Mar 20, 2026

Copy link
Copy Markdown

Execution-Time Benchmarks Report ⏱️

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

⚠️ Potential regressions detected

HttpMessageHandler

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration192.79 ± (192.85 - 193.66) ms207.02 ± (207.19 - 208.19) ms+7.4%❌⬆️
.NET Framework 4.8 - Bailout
duration196.20 ± (195.92 - 196.62) ms212.29 ± (212.31 - 213.48) ms+8.2%❌⬆️
Full Metrics Comparison

FakeDbCommand

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration68.64 ± (68.83 - 69.29) ms72.11 ± (72.07 - 72.44) ms+5.0%✅⬆️
.NET Framework 4.8 - Bailout
duration79.83 ± (78.88 - 80.41) ms76.28 ± (76.09 - 76.45) ms-4.5%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1047.72 ± (1050.50 - 1058.26) ms1075.13 ± (1075.47 - 1081.61) ms+2.6%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms21.78 ± (21.75 - 21.81) ms22.43 ± (22.39 - 22.46) ms+3.0%✅⬆️
process.time_to_main_ms79.31 ± (79.15 - 79.47) ms84.02 ± (83.83 - 84.22) ms+5.9%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.90 ± (10.90 - 10.91) MB10.92 ± (10.92 - 10.92) MB+0.2%✅⬆️
runtime.dotnet.threads.count12 ± (12 - 12)12 ± (12 - 12)+0.0%
.NET Core 3.1 - Bailout
process.internal_duration_ms21.73 ± (21.71 - 21.75) ms22.41 ± (22.37 - 22.44) ms+3.1%✅⬆️
process.time_to_main_ms80.66 ± (80.54 - 80.78) ms85.41 ± (85.23 - 85.58) ms+5.9%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.94 ± (10.93 - 10.94) MB10.95 ± (10.95 - 10.96) MB+0.1%✅⬆️
runtime.dotnet.threads.count13 ± (13 - 13)13 ± (13 - 13)+0.0%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms216.87 ± (215.60 - 218.14) ms225.42 ± (224.14 - 226.70) ms+3.9%✅⬆️
process.time_to_main_ms520.24 ± (519.26 - 521.21) ms535.23 ± (533.93 - 536.54) ms+2.9%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed48.24 ± (48.21 - 48.26) MB48.23 ± (48.20 - 48.26) MB-0.0%
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)-1.2%
.NET 6 - Baseline
process.internal_duration_ms20.58 ± (20.55 - 20.60) ms21.03 ± (21.00 - 21.07) ms+2.2%✅⬆️
process.time_to_main_ms68.89 ± (68.75 - 69.03) ms72.61 ± (72.43 - 72.80) ms+5.4%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.59 ± (10.59 - 10.59) MB10.63 ± (10.63 - 10.63) MB+0.4%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 6 - Bailout
process.internal_duration_ms20.59 ± (20.56 - 20.62) ms20.94 ± (20.90 - 20.97) ms+1.7%✅⬆️
process.time_to_main_ms69.81 ± (69.67 - 69.94) ms73.52 ± (73.33 - 73.71) ms+5.3%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.66 ± (10.65 - 10.66) MB10.74 ± (10.73 - 10.74) MB+0.7%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms208.33 ± (207.01 - 209.64) ms213.92 ± (212.42 - 215.42) ms+2.7%✅⬆️
process.time_to_main_ms518.76 ± (517.69 - 519.83) ms536.95 ± (535.59 - 538.31) ms+3.5%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed50.00 ± (49.95 - 50.05) MB50.15 ± (50.11 - 50.18) MB+0.3%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)+0.2%✅⬆️
.NET 8 - Baseline
process.internal_duration_ms18.74 ± (18.71 - 18.77) ms19.17 ± (19.13 - 19.22) ms+2.3%✅⬆️
process.time_to_main_ms67.94 ± (67.80 - 68.09) ms71.40 ± (71.27 - 71.53) ms+5.1%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.67 ± (7.66 - 7.67) MB7.69 ± (7.68 - 7.70) MB+0.3%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 8 - Bailout
process.internal_duration_ms18.71 ± (18.68 - 18.73) ms19.19 ± (19.15 - 19.23) ms+2.6%✅⬆️
process.time_to_main_ms69.13 ± (69.02 - 69.24) ms72.51 ± (72.33 - 72.68) ms+4.9%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.76 ± (7.75 - 7.77) MB7.74 ± (7.73 - 7.75) MB-0.2%
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms153.29 ± (152.58 - 154.01) ms159.15 ± (158.38 - 159.91) ms+3.8%✅⬆️
process.time_to_main_ms477.64 ± (476.73 - 478.56) ms491.72 ± (490.96 - 492.49) ms+2.9%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed36.90 ± (36.87 - 36.92) MB37.01 ± (36.99 - 37.02) MB+0.3%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)+0.1%✅⬆️

HttpMessageHandler

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration192.79 ± (192.85 - 193.66) ms207.02 ± (207.19 - 208.19) ms+7.4%❌⬆️
.NET Framework 4.8 - Bailout
duration196.20 ± (195.92 - 196.62) ms212.29 ± (212.31 - 213.48) ms+8.2%❌⬆️
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1158.67 ± (1160.42 - 1168.44) ms1214.21 ± (1213.79 - 1219.84) ms+4.8%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms187.03 ± (186.69 - 187.37) ms203.04 ± (202.50 - 203.58) ms+8.6%✅⬆️
process.time_to_main_ms80.51 ± (80.27 - 80.75) ms87.35 ± (87.08 - 87.62) ms+8.5%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.11 ± (16.07 - 16.14) MB15.93 ± (15.91 - 15.95) MB-1.1%
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)+1.2%✅⬆️
.NET Core 3.1 - Bailout
process.internal_duration_ms186.97 ± (186.60 - 187.34) ms203.14 ± (202.53 - 203.75) ms+8.6%✅⬆️
process.time_to_main_ms82.01 ± (81.85 - 82.17) ms88.69 ± (88.43 - 88.95) ms+8.2%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.16 ± (16.13 - 16.18) MB16.02 ± (16.00 - 16.03) MB-0.9%
runtime.dotnet.threads.count21 ± (20 - 21)21 ± (21 - 21)+1.6%✅⬆️
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms391.58 ± (390.14 - 393.02) ms412.83 ± (411.53 - 414.14) ms+5.4%✅⬆️
process.time_to_main_ms521.25 ± (520.06 - 522.45) ms552.42 ± (551.31 - 553.54) ms+6.0%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed58.43 ± (58.22 - 58.64) MB59.02 ± (58.98 - 59.06) MB+1.0%✅⬆️
runtime.dotnet.threads.count30 ± (30 - 30)30 ± (30 - 30)+0.4%✅⬆️
.NET 6 - Baseline
process.internal_duration_ms191.92 ± (191.61 - 192.24) ms211.41 ± (210.60 - 212.23) ms+10.2%✅⬆️
process.time_to_main_ms70.05 ± (69.87 - 70.23) ms76.89 ± (76.64 - 77.15) ms+9.8%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.06 ± (15.91 - 16.22) MB16.23 ± (16.21 - 16.26) MB+1.1%✅⬆️
runtime.dotnet.threads.count18 ± (18 - 18)19 ± (19 - 19)+6.9%✅⬆️
.NET 6 - Bailout
process.internal_duration_ms190.73 ± (190.44 - 191.01) ms211.74 ± (210.99 - 212.48) ms+11.0%✅⬆️
process.time_to_main_ms70.86 ± (70.73 - 70.98) ms78.27 ± (78.04 - 78.49) ms+10.5%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.29 ± (16.19 - 16.40) MB16.27 ± (16.25 - 16.29) MB-0.2%
runtime.dotnet.threads.count19 ± (19 - 20)21 ± (20 - 21)+6.2%✅⬆️
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms413.43 ± (412.12 - 414.73) ms441.88 ± (440.44 - 443.32) ms+6.9%✅⬆️
process.time_to_main_ms523.97 ± (522.53 - 525.41) ms561.95 ± (560.72 - 563.17) ms+7.2%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed60.94 ± (60.90 - 60.99) MB60.92 ± (60.87 - 60.97) MB-0.0%
runtime.dotnet.threads.count31 ± (30 - 31)31 ± (31 - 31)+1.1%✅⬆️
.NET 8 - Baseline
process.internal_duration_ms190.20 ± (189.80 - 190.61) ms207.67 ± (207.17 - 208.16) ms+9.2%✅⬆️
process.time_to_main_ms69.52 ± (69.33 - 69.72) ms75.55 ± (75.36 - 75.74) ms+8.7%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.75 ± (11.73 - 11.78) MB11.59 ± (11.57 - 11.60) MB-1.4%
runtime.dotnet.threads.count18 ± (18 - 18)19 ± (19 - 19)+3.5%✅⬆️
.NET 8 - Bailout
process.internal_duration_ms188.96 ± (188.44 - 189.48) ms208.77 ± (208.18 - 209.36) ms+10.5%✅⬆️
process.time_to_main_ms70.72 ± (70.52 - 70.92) ms77.55 ± (77.36 - 77.73) ms+9.7%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.76 ± (11.69 - 11.83) MB11.63 ± (11.61 - 11.64) MB-1.1%
runtime.dotnet.threads.count19 ± (19 - 19)20 ± (20 - 20)+3.5%✅⬆️
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms340.13 ± (339.04 - 341.22) ms400.46 ± (393.21 - 407.72) ms+17.7%✅⬆️
process.time_to_main_ms478.95 ± (478.09 - 479.81) ms520.75 ± (519.84 - 521.65) ms+8.7%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed48.87 ± (48.83 - 48.91) MB49.45 ± (49.29 - 49.61) MB+1.2%✅⬆️
runtime.dotnet.threads.count30 ± (30 - 30)30 ± (30 - 30)+0.1%✅⬆️
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 (8349) - mean (72ms)  : 70, 75
    master - mean (69ms)  : 66, 72

    section Bailout
    This PR (8349) - mean (76ms)  : 74, 78
    master - mean (80ms)  : 69, 91

    section CallTarget+Inlining+NGEN
    This PR (8349) - mean (1,079ms)  : 1035, 1123
    master - mean (1,054ms)  : 999, 1109

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 (8349) - mean (113ms)  : 110, 117
    master - mean (107ms)  : 104, 110

    section Bailout
    This PR (8349) - mean (115ms)  : crit, 112, 117
    master - mean (108ms)  : 106, 110

    section CallTarget+Inlining+NGEN
    This PR (8349) - mean (796ms)  : 775, 817
    master - mean (777ms)  : 751, 802

Loading
FakeDbCommand (.NET 6)
gantt
    title Execution time (ms) FakeDbCommand (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8349) - mean (100ms)  : 97, 103
    master - mean (95ms)  : 92, 97

    section Bailout
    This PR (8349) - mean (101ms)  : 98, 103
    master - mean (95ms)  : 93, 98

    section CallTarget+Inlining+NGEN
    This PR (8349) - mean (788ms)  : 769, 807
    master - mean (760ms)  : 736, 784

Loading
FakeDbCommand (.NET 8)
gantt
    title Execution time (ms) FakeDbCommand (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8349) - mean (98ms)  : 96, 101
    master - mean (93ms)  : 90, 96

    section Bailout
    This PR (8349) - mean (99ms)  : 97, 102
    master - mean (94ms)  : 93, 96

    section CallTarget+Inlining+NGEN
    This PR (8349) - mean (688ms)  : 666, 710
    master - mean (661ms)  : 645, 677

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 (8349) - mean (208ms)  : 201, 215
    master - mean (193ms)  : 189, 197

    section Bailout
    This PR (8349) - mean (213ms)  : crit, 204, 222
    master - mean (196ms)  : 193, 200

    section CallTarget+Inlining+NGEN
    This PR (8349) - mean (1,217ms)  : 1173, 1260
    master - mean (1,164ms)  : 1107, 1222

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 (8349) - mean (300ms)  : 291, 309
    master - mean (276ms)  : 270, 282

    section Bailout
    This PR (8349) - mean (302ms)  : crit, 290, 314
    master - mean (277ms)  : 272, 282

    section CallTarget+Inlining+NGEN
    This PR (8349) - mean (1,000ms)  : crit, 961, 1039
    master - mean (942ms)  : 923, 961

Loading
HttpMessageHandler (.NET 6)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8349) - mean (298ms)  : 280, 315
    master - mean (270ms)  : 266, 274

    section Bailout
    This PR (8349) - mean (300ms)  : crit, 285, 315
    master - mean (269ms)  : 265, 274

    section CallTarget+Inlining+NGEN
    This PR (8349) - mean (1,040ms)  : crit, 1013, 1067
    master - mean (965ms)  : 943, 988

Loading
HttpMessageHandler (.NET 8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8349) - mean (294ms)  : 284, 303
    master - mean (269ms)  : 263, 275

    section Bailout
    This PR (8349) - mean (297ms)  : crit, 287, 307
    master - mean (269ms)  : 262, 276

    section CallTarget+Inlining+NGEN
    This PR (8349) - mean (955ms)  : crit, 847, 1063
    master - mean (850ms)  : 829, 871

Loading

Base automatically changed from andrew/analyzers/use-constant-arrays to master March 24, 2026 15:13
@dudikeleti dudikeleti requested review from a team as code owners March 24, 2026 15:13
@andrewlock andrewlock force-pushed the andrew/analyzers/use-stringsplitter branch from 7b1aeb3 to c5501e0 Compare March 25, 2026 11:52
@andrewlock andrewlock enabled auto-merge (squash) March 25, 2026 11:52
@andrewlock andrewlock merged commit f3f9047 into master Mar 25, 2026
142 checks passed
@andrewlock andrewlock deleted the andrew/analyzers/use-stringsplitter branch March 25, 2026 14:13
@github-actions github-actions Bot added this to the vNext-v3 milestone Mar 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AI Generated Largely based on code generated by an AI or LLM. This label is the same across all dd-trace-* repos type:performance Performance, speed, latency, resource usage (CPU, memory) type:refactor

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants