Skip to content

Conversation

@igoragoli
Copy link
Contributor

@igoragoli igoragoli commented Nov 19, 2025

Summary of changes

  • Set benchmarking jobs as interruptible when outside master.

Also:

Reason for change

APMSP-2369 and #incident-45572

Why set jobs to interruptible? Because by doing so, we prevent redundant runs from overloading our APM runner capacity.

Why only outside of master? Because benchmarks on master are never redundant: we need every run on master to collect results and maintain a continuous performance history.

Implementation details

Test coverage

A dummy commit, a95a4f9, cancelling previous microbenchmarks from 1cd3cd2:

image

For macrobenchmarks:

image

Other details

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

dd-trace-dotnet-ci-bot bot commented Nov 19, 2025

Execution-Time Benchmarks Report ⏱️

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

✅ No regressions detected - check the details below

Full Metrics Comparison

FakeDbCommand

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration74.45 ± (74.75 - 75.50) ms76.09 ± (76.21 - 77.13) ms+2.2%✅⬆️
.NET Framework 4.8 - Bailout
duration81.19 ± (81.05 - 81.80) ms80.00 ± (80.29 - 81.27) ms-1.5%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1105.65 ± (1105.93 - 1115.46) ms1063.58 ± (1067.02 - 1079.16) ms-3.8%
.NET Core 3.1 - Baseline
process.internal_duration_ms22.78 ± (22.71 - 22.86) ms22.97 ± (22.89 - 23.05) ms+0.8%✅⬆️
process.time_to_main_ms86.86 ± (86.52 - 87.20) ms88.73 ± (88.23 - 89.23) ms+2.2%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.90 ± (10.90 - 10.90) MB10.92 ± (10.92 - 10.93) MB+0.2%✅⬆️
runtime.dotnet.threads.count12 ± (12 - 12)12 ± (12 - 12)+0.0%
.NET Core 3.1 - Bailout
process.internal_duration_ms22.84 ± (22.74 - 22.93) ms22.87 ± (22.80 - 22.94) ms+0.1%✅⬆️
process.time_to_main_ms88.76 ± (88.30 - 89.23) ms89.59 ± (89.14 - 90.03) ms+0.9%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.94 ± (10.94 - 10.95) MB10.97 ± (10.96 - 10.97) MB+0.2%✅⬆️
runtime.dotnet.threads.count13 ± (13 - 13)13 ± (13 - 13)+0.0%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms219.70 ± (218.09 - 221.32) ms225.02 ± (223.57 - 226.46) ms+2.4%✅⬆️
process.time_to_main_ms548.64 ± (547.49 - 549.78) ms505.89 ± (504.60 - 507.18) ms-7.8%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed52.50 ± (52.48 - 52.52) MB47.75 ± (47.72 - 47.77) MB-9.1%
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)-0.0%
.NET 6 - Baseline
process.internal_duration_ms21.88 ± (21.81 - 21.95) ms21.97 ± (21.89 - 22.06) ms+0.4%✅⬆️
process.time_to_main_ms76.63 ± (76.32 - 76.94) ms77.31 ± (76.92 - 77.70) ms+0.9%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.59 ± (10.59 - 10.60) 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_ms21.59 ± (21.53 - 21.66) ms21.97 ± (21.89 - 22.04) ms+1.7%✅⬆️
process.time_to_main_ms76.83 ± (76.47 - 77.19) ms78.83 ± (78.40 - 79.26) ms+2.6%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.64 ± (10.64 - 10.65) MB10.67 ± (10.66 - 10.67) MB+0.2%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms206.70 ± (205.14 - 208.26) ms211.96 ± (210.46 - 213.46) ms+2.5%✅⬆️
process.time_to_main_ms516.28 ± (515.38 - 517.18) ms472.47 ± (471.30 - 473.65) ms-8.5%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed51.61 ± (51.59 - 51.64) MB48.01 ± (47.98 - 48.03) MB-7.0%
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)+0.1%✅⬆️
.NET 8 - Baseline
process.internal_duration_ms20.03 ± (19.97 - 20.09) ms20.28 ± (20.21 - 20.35) ms+1.2%✅⬆️
process.time_to_main_ms76.31 ± (75.99 - 76.63) ms76.86 ± (76.46 - 77.26) ms+0.7%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.66 ± (7.65 - 7.67) MB7.65 ± (7.64 - 7.65) MB-0.2%
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 8 - Bailout
process.internal_duration_ms19.86 ± (19.80 - 19.92) ms20.16 ± (20.09 - 20.24) ms+1.5%✅⬆️
process.time_to_main_ms76.54 ± (76.27 - 76.82) ms78.75 ± (78.35 - 79.16) ms+2.9%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.70 ± (7.69 - 7.70) MB7.70 ± (7.69 - 7.71) MB+0.1%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms192.15 ± (191.14 - 193.16) ms196.52 ± (195.36 - 197.68) ms+2.3%✅⬆️
process.time_to_main_ms494.11 ± (492.94 - 495.29) ms463.47 ± (462.08 - 464.86) ms-6.2%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed38.89 ± (38.85 - 38.93) MB36.46 ± (36.43 - 36.50) MB-6.2%
runtime.dotnet.threads.count27 ± (27 - 27)27 ± (27 - 27)+0.4%✅⬆️

HttpMessageHandler

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration192.85 ± (192.77 - 193.62) ms193.23 ± (193.18 - 194.10) ms+0.2%✅⬆️
.NET Framework 4.8 - Bailout
duration196.38 ± (196.20 - 196.65) ms196.31 ± (196.14 - 196.66) ms-0.0%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1169.29 ± (1175.15 - 1184.69) ms1119.03 ± (1121.59 - 1132.69) ms-4.3%
.NET Core 3.1 - Baseline
process.internal_duration_ms188.71 ± (188.18 - 189.24) ms188.98 ± (188.52 - 189.43) ms+0.1%✅⬆️
process.time_to_main_ms81.07 ± (80.82 - 81.32) ms80.88 ± (80.66 - 81.10) ms-0.2%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.05 ± (16.03 - 16.08) MB16.10 ± (16.06 - 16.13) MB+0.3%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (19 - 20)-0.3%
.NET Core 3.1 - Bailout
process.internal_duration_ms187.45 ± (187.16 - 187.75) ms187.39 ± (187.12 - 187.67) ms-0.0%
process.time_to_main_ms82.07 ± (81.89 - 82.25) ms81.76 ± (81.63 - 81.89) ms-0.4%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.11 ± (16.08 - 16.14) MB16.12 ± (16.09 - 16.15) MB+0.1%✅⬆️
runtime.dotnet.threads.count21 ± (21 - 21)21 ± (20 - 21)-0.6%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms399.36 ± (396.41 - 402.30) ms404.83 ± (401.70 - 407.95) ms+1.4%✅⬆️
process.time_to_main_ms518.58 ± (517.87 - 519.29) ms473.01 ± (472.29 - 473.74) ms-8.8%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed62.82 ± (62.67 - 62.97) MB58.60 ± (58.48 - 58.72) MB-6.7%
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 30)+0.2%✅⬆️
.NET 6 - Baseline
process.internal_duration_ms192.15 ± (191.79 - 192.51) ms197.69 ± (197.27 - 198.12) ms+2.9%✅⬆️
process.time_to_main_ms69.93 ± (69.77 - 70.09) ms71.76 ± (71.50 - 72.02) ms+2.6%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed15.86 ± (15.70 - 16.02) MB16.33 ± (16.31 - 16.35) MB+3.0%✅⬆️
runtime.dotnet.threads.count18 ± (18 - 18)19 ± (19 - 19)+6.6%✅⬆️
.NET 6 - Bailout
process.internal_duration_ms191.22 ± (190.94 - 191.50) ms194.19 ± (193.74 - 194.64) ms+1.6%✅⬆️
process.time_to_main_ms70.82 ± (70.72 - 70.91) ms71.67 ± (71.49 - 71.85) ms+1.2%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.30 ± (16.18 - 16.41) MB16.34 ± (16.26 - 16.43) MB+0.3%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)+0.2%✅⬆️
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms407.78 ± (404.99 - 410.57) ms418.32 ± (415.24 - 421.41) ms+2.6%✅⬆️
process.time_to_main_ms488.86 ± (488.27 - 489.46) ms447.57 ± (446.73 - 448.42) ms-8.4%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed62.09 ± (61.94 - 62.23) MB58.83 ± (58.70 - 58.96) MB-5.2%
runtime.dotnet.threads.count29 ± (29 - 29)30 ± (30 - 30)+0.3%✅⬆️
.NET 8 - Baseline
process.internal_duration_ms190.38 ± (190.07 - 190.69) ms191.68 ± (191.28 - 192.07) ms+0.7%✅⬆️
process.time_to_main_ms69.59 ± (69.44 - 69.74) ms69.57 ± (69.41 - 69.73) ms-0.0%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.81 ± (11.78 - 11.84) MB11.74 ± (11.72 - 11.76) MB-0.6%
runtime.dotnet.threads.count18 ± (18 - 18)18 ± (18 - 18)+0.2%✅⬆️
.NET 8 - Bailout
process.internal_duration_ms190.53 ± (190.09 - 190.96) ms190.31 ± (189.94 - 190.67) ms-0.1%
process.time_to_main_ms70.72 ± (70.56 - 70.87) ms70.53 ± (70.39 - 70.67) ms-0.3%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.81 ± (11.79 - 11.84) MB11.82 ± (11.79 - 11.85) MB+0.1%✅⬆️
runtime.dotnet.threads.count19 ± (19 - 19)19 ± (19 - 19)+0.0%✅⬆️
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms363.26 ± (361.70 - 364.82) ms368.20 ± (366.75 - 369.64) ms+1.4%✅⬆️
process.time_to_main_ms466.09 ± (465.41 - 466.77) ms431.59 ± (430.99 - 432.18) ms-7.4%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed50.46 ± (50.42 - 50.49) MB47.96 ± (47.93 - 47.99) MB-5.0%
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 (7841) - mean (77ms)  : 70, 84
    master - mean (75ms)  : 70, 81

    section Bailout
    This PR (7841) - mean (81ms)  : 73, 88
    master - mean (81ms)  : 76, 87

    section CallTarget+Inlining+NGEN
    This PR (7841) - mean (1,073ms)  : 982, 1165
    master - mean (1,111ms)  : 1043, 1179

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 (7841) - mean (119ms)  : 109, 130
    master - mean (117ms)  : 110, 124

    section Bailout
    This PR (7841) - mean (120ms)  : 110, 130
    master - mean (119ms)  : 112, 126

    section CallTarget+Inlining+NGEN
    This PR (7841) - mean (767ms)  : 727, 807
    master - mean (800ms)  : 762, 837

Loading
FakeDbCommand (.NET 6)
gantt
    title Execution time (ms) FakeDbCommand (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (7841) - mean (106ms)  : 98, 115
    master - mean (105ms)  : 100, 111

    section Bailout
    This PR (7841) - mean (108ms)  : 99, 116
    master - mean (105ms)  : 99, 112

    section CallTarget+Inlining+NGEN
    This PR (7841) - mean (716ms)  : 672, 760
    master - mean (754ms)  : 720, 788

Loading
FakeDbCommand (.NET 8)
gantt
    title Execution time (ms) FakeDbCommand (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (7841) - mean (106ms)  : 99, 113
    master - mean (105ms)  : 100, 110

    section Bailout
    This PR (7841) - mean (108ms)  : 100, 115
    master - mean (105ms)  : 99, 110

    section CallTarget+Inlining+NGEN
    This PR (7841) - mean (698ms)  : 652, 743
    master - mean (718ms)  : 684, 753

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 (7841) - mean (194ms)  : 188, 199
    master - mean (193ms)  : 188, 198

    section Bailout
    This PR (7841) - mean (196ms)  : 194, 199
    master - mean (196ms)  : 194, 199

    section CallTarget+Inlining+NGEN
    This PR (7841) - mean (1,127ms)  : 1048, 1206
    master - mean (1,180ms)  : 1107, 1252

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 (7841) - mean (279ms)  : 272, 286
    master - mean (278ms)  : 272, 284

    section Bailout
    This PR (7841) - mean (277ms)  : 273, 281
    master - mean (278ms)  : 273, 283

    section CallTarget+Inlining+NGEN
    This PR (7841) - mean (910ms)  : 849, 971
    master - mean (953ms)  : 900, 1006

Loading
HttpMessageHandler (.NET 6)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (7841) - mean (277ms)  : 269, 286
    master - mean (270ms)  : 266, 274

    section Bailout
    This PR (7841) - mean (274ms)  : 267, 281
    master - mean (270ms)  : 266, 274

    section CallTarget+Inlining+NGEN
    This PR (7841) - mean (898ms)  : 839, 957
    master - mean (929ms)  : 885, 972

Loading
HttpMessageHandler (.NET 8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (7841) - mean (271ms)  : 261, 280
    master - mean (270ms)  : 266, 274

    section Bailout
    This PR (7841) - mean (270ms)  : 266, 274
    master - mean (271ms)  : 264, 278

    section CallTarget+Inlining+NGEN
    This PR (7841) - mean (831ms)  : 806, 857
    master - mean (860ms)  : 833, 887

Loading

@pr-commenter
Copy link

pr-commenter bot commented Nov 19, 2025

Benchmarks

Benchmarks Report for benchmark platform 🐌

Benchmarks for #7841 compared to master:

  • 1 benchmarks are faster, with geometric mean 1.306
  • 4 benchmarks have fewer allocations
  • 6 benchmarks have more allocations

The following thresholds were used for comparing the benchmark speeds:

  • Mann–Whitney U test with statistical test for significance of 5%
  • Only results indicating a difference greater than 10% and 0.3 ns are considered.

Allocation changes below 0.5% are ignored.

Benchmark details

Benchmarks.Trace.ActivityBenchmark - Same speed ✔️ Fewer allocations 🎉

Fewer allocations 🎉 in #7841

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.ActivityBenchmark.StartStopWithChild‑netcoreapp3.1 5.75 KB 5.71 KB -40 B -0.70%

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master StartStopWithChild net6.0 10.5μs 57.5ns 315ns 0 0 0 5.52 KB
master StartStopWithChild netcoreapp3.1 13.6μs 70ns 343ns 0 0 0 5.75 KB
master StartStopWithChild net472 22.4μs 119ns 664ns 1.06 0.318 0.106 6.07 KB
#7841 StartStopWithChild net6.0 10.9μs 58.4ns 335ns 0 0 0 5.51 KB
#7841 StartStopWithChild netcoreapp3.1 13.6μs 63.8ns 247ns 0 0 0 5.71 KB
#7841 StartStopWithChild net472 22μs 125ns 836ns 1.06 0.425 0.106 6.1 KB
Benchmarks.Trace.AgentWriterBenchmark - Same speed ✔️ More allocations ⚠️

More allocations ⚠️ in #7841

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces‑net472 3.31 KB 3.35 KB 46 B 1.39%

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master WriteAndFlushEnrichedTraces net6.0 933μs 124ns 429ns 0 0 0 2.71 KB
master WriteAndFlushEnrichedTraces netcoreapp3.1 1.01ms 57.5ns 199ns 0 0 0 2.7 KB
master WriteAndFlushEnrichedTraces net472 1.19ms 140ns 524ns 0 0 0 3.31 KB
#7841 WriteAndFlushEnrichedTraces net6.0 932μs 31.9ns 119ns 0 0 0 2.7 KB
#7841 WriteAndFlushEnrichedTraces netcoreapp3.1 1.02ms 260ns 1.01μs 0 0 0 2.7 KB
#7841 WriteAndFlushEnrichedTraces net472 1.24ms 2.49μs 9.63μs 0 0 0 3.35 KB
Benchmarks.Trace.Asm.AppSecBodyBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master AllCycleSimpleBody net6.0 1.06μs 5.05ns 20.8ns 0 0 0 1.22 KB
master AllCycleSimpleBody netcoreapp3.1 1.42μs 7.41ns 38.5ns 0 0 0 1.2 KB
master AllCycleSimpleBody net472 1.03μs 3.88ns 15ns 0.192 0 0 1.23 KB
master AllCycleMoreComplexBody net6.0 7.05μs 38ns 197ns 0 0 0 4.72 KB
master AllCycleMoreComplexBody netcoreapp3.1 8.95μs 42.7ns 171ns 0 0 0 4.62 KB
master AllCycleMoreComplexBody net472 7.54μs 5.04ns 19.5ns 0.718 0 0 4.74 KB
master ObjectExtractorSimpleBody net6.0 317ns 0.312ns 1.17ns 0 0 0 280 B
master ObjectExtractorSimpleBody netcoreapp3.1 398ns 1.95ns 8.27ns 0 0 0 272 B
master ObjectExtractorSimpleBody net472 294ns 0.0579ns 0.224ns 0.0445 0 0 281 B
master ObjectExtractorMoreComplexBody net6.0 6.44μs 0.746ns 2.89ns 0 0 0 3.78 KB
master ObjectExtractorMoreComplexBody netcoreapp3.1 7.77μs 32.1ns 124ns 0 0 0 3.69 KB
master ObjectExtractorMoreComplexBody net472 6.73μs 6.16ns 23.9ns 0.573 0 0 3.8 KB
#7841 AllCycleSimpleBody net6.0 1.06μs 6.27ns 61.7ns 0 0 0 1.22 KB
#7841 AllCycleSimpleBody netcoreapp3.1 1.38μs 7.64ns 47.7ns 0 0 0 1.2 KB
#7841 AllCycleSimpleBody net472 1.04μs 0.468ns 1.69ns 0.193 0 0 1.23 KB
#7841 AllCycleMoreComplexBody net6.0 7.24μs 26.5ns 99.2ns 0 0 0 4.72 KB
#7841 AllCycleMoreComplexBody netcoreapp3.1 9μs 31.7ns 123ns 0 0 0 4.62 KB
#7841 AllCycleMoreComplexBody net472 7.67μs 3.46ns 13.4ns 0.729 0 0 4.74 KB
#7841 ObjectExtractorSimpleBody net6.0 332ns 0.135ns 0.487ns 0 0 0 280 B
#7841 ObjectExtractorSimpleBody netcoreapp3.1 395ns 2.15ns 11.8ns 0 0 0 272 B
#7841 ObjectExtractorSimpleBody net472 298ns 0.0747ns 0.289ns 0.0435 0 0 281 B
#7841 ObjectExtractorMoreComplexBody net6.0 6.37μs 3.45ns 13.4ns 0 0 0 3.78 KB
#7841 ObjectExtractorMoreComplexBody netcoreapp3.1 7.85μs 38.4ns 153ns 0 0 0 3.69 KB
#7841 ObjectExtractorMoreComplexBody net472 6.73μs 5.61ns 21.7ns 0.57 0 0 3.8 KB
Benchmarks.Trace.Asm.AppSecEncoderBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EncodeArgs net6.0 77.3μs 255ns 918ns 0 0 0 32.4 KB
master EncodeArgs netcoreapp3.1 98.4μs 51.8ns 200ns 0 0 0 32.4 KB
master EncodeArgs net472 109μs 16.7ns 64.5ns 4.9 0 0 32.51 KB
master EncodeLegacyArgs net6.0 145μs 19.2ns 66.6ns 0 0 0 2.15 KB
master EncodeLegacyArgs netcoreapp3.1 199μs 221ns 764ns 0 0 0 2.15 KB
master EncodeLegacyArgs net472 263μs 18.6ns 64.5ns 0 0 0 2.16 KB
#7841 EncodeArgs net6.0 76.8μs 183ns 686ns 0 0 0 32.4 KB
#7841 EncodeArgs netcoreapp3.1 96.8μs 232ns 803ns 0 0 0 32.4 KB
#7841 EncodeArgs net472 109μs 36.6ns 142ns 4.93 0 0 32.5 KB
#7841 EncodeLegacyArgs net6.0 144μs 38.9ns 140ns 0 0 0 2.14 KB
#7841 EncodeLegacyArgs netcoreapp3.1 199μs 215ns 832ns 0 0 0 2.14 KB
#7841 EncodeLegacyArgs net472 264μs 36.7ns 142ns 0 0 0 2.17 KB
Benchmarks.Trace.Asm.AppSecWafBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master RunWafRealisticBenchmark net6.0 394μs 75.2ns 291ns 0 0 0 4.56 KB
master RunWafRealisticBenchmark netcoreapp3.1 859μs 2.41μs 9.02μs 0 0 0 4.48 KB
master RunWafRealisticBenchmark net472 428μs 43.2ns 167ns 0 0 0 4.66 KB
master RunWafRealisticBenchmarkWithAttack net6.0 287μs 35.8ns 139ns 0 0 0 2.24 KB
master RunWafRealisticBenchmarkWithAttack netcoreapp3.1 308μs 310ns 1.2μs 0 0 0 2.22 KB
master RunWafRealisticBenchmarkWithAttack net472 310μs 33ns 128ns 0 0 0 2.29 KB
#7841 RunWafRealisticBenchmark net6.0 394μs 42.8ns 160ns 0 0 0 4.55 KB
#7841 RunWafRealisticBenchmark netcoreapp3.1 826μs 9.9μs 98.5μs 0 0 0 4.48 KB
#7841 RunWafRealisticBenchmark net472 432μs 54.4ns 203ns 0 0 0 4.66 KB
#7841 RunWafRealisticBenchmarkWithAttack net6.0 285μs 47ns 176ns 0 0 0 2.24 KB
#7841 RunWafRealisticBenchmarkWithAttack netcoreapp3.1 296μs 160ns 618ns 0 0 0 2.22 KB
#7841 RunWafRealisticBenchmarkWithAttack net472 309μs 41.5ns 161ns 0 0 0 2.29 KB
Benchmarks.Trace.AspNetCoreBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendRequest net6.0 61.5μs 31ns 120ns 0 0 0 14.52 KB
master SendRequest netcoreapp3.1 71.2μs 118ns 425ns 0 0 0 17.42 KB
master SendRequest net472 0.013ns 0.00324ns 0.0126ns 0 0 0 0 b
#7841 SendRequest net6.0 61.7μs 47ns 163ns 0 0 0 14.52 KB
#7841 SendRequest netcoreapp3.1 70.9μs 79.6ns 308ns 0 0 0 17.42 KB
#7841 SendRequest net472 0.00241ns 0.0012ns 0.00466ns 0 0 0 0 b
Benchmarks.Trace.CharSliceBenchmark - Same speed ✔️ More allocations ⚠️

More allocations ⚠️ in #7841

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice‑net6.0 4 B 7 B 3 B 75.00%

Fewer allocations 🎉 in #7841

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool‑net6.0 5 B 3 B -2 B -40.00%

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master OriginalCharSlice net6.0 1.88ms 340ns 1.32μs 0 0 0 640.01 KB
master OriginalCharSlice netcoreapp3.1 2.11ms 4.93μs 19.1μs 0 0 0 640 KB
master OriginalCharSlice net472 2.69ms 358ns 1.34μs 100 0 0 641.95 KB
master OptimizedCharSlice net6.0 1.34ms 160ns 620ns 0 0 0 4 B
master OptimizedCharSlice netcoreapp3.1 1.77ms 489ns 1.89μs 0 0 0 1 B
master OptimizedCharSlice net472 1.9ms 173ns 672ns 0 0 0 0 b
master OptimizedCharSliceWithPool net6.0 910μs 70.4ns 263ns 0 0 0 5 B
master OptimizedCharSliceWithPool netcoreapp3.1 818μs 108ns 417ns 0 0 0 1 B
master OptimizedCharSliceWithPool net472 1.26ms 320ns 1.24μs 0 0 0 0 b
#7841 OriginalCharSlice net6.0 1.97ms 636ns 2.46μs 0 0 0 640.01 KB
#7841 OriginalCharSlice netcoreapp3.1 2.22ms 3.43μs 12.8μs 0 0 0 640 KB
#7841 OriginalCharSlice net472 2.64ms 140ns 506ns 100 0 0 641.95 KB
#7841 OptimizedCharSlice net6.0 1.43ms 175ns 677ns 0 0 0 7 B
#7841 OptimizedCharSlice netcoreapp3.1 1.65ms 615ns 2.3μs 0 0 0 1 B
#7841 OptimizedCharSlice net472 2.01ms 297ns 1.15μs 0 0 0 0 b
#7841 OptimizedCharSliceWithPool net6.0 903μs 64.6ns 250ns 0 0 0 3 B
#7841 OptimizedCharSliceWithPool netcoreapp3.1 816μs 205ns 794ns 0 0 0 1 B
#7841 OptimizedCharSliceWithPool net472 1.13ms 98ns 379ns 0 0 0 0 b
Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark - Faster 🎉 Fewer allocations 🎉

Faster 🎉 in #7841

Benchmark base/diff Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces‑netcoreapp3.1 1.306 793,195.07 607,127.71

Fewer allocations 🎉 in #7841

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces‑net472 56.25 KB 55.86 KB -395 B -0.70%
Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces‑netcoreapp3.1 42.74 KB 42.16 KB -582 B -1.36%

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master WriteAndFlushEnrichedTraces net6.0 701μs 894ns 3.46μs 0 0 0 41.79 KB
master WriteAndFlushEnrichedTraces netcoreapp3.1 792μs 1.9μs 7.09μs 0 0 0 42.74 KB
master WriteAndFlushEnrichedTraces net472 862μs 2.77μs 10.7μs 8.33 0 0 56.25 KB
#7841 WriteAndFlushEnrichedTraces net6.0 641μs 272ns 1.05μs 0 0 0 41.73 KB
#7841 WriteAndFlushEnrichedTraces netcoreapp3.1 611μs 2.45μs 9.18μs 0 0 0 42.16 KB
#7841 WriteAndFlushEnrichedTraces net472 906μs 2.71μs 10.1μs 4.46 0 0 55.86 KB
Benchmarks.Trace.DbCommandBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master ExecuteNonQuery net6.0 1.93μs 8.76ns 33.9ns 0 0 0 1.02 KB
master ExecuteNonQuery netcoreapp3.1 2.54μs 10.4ns 40.5ns 0 0 0 1.02 KB
master ExecuteNonQuery net472 2.84μs 4.07ns 15.8ns 0.156 0.0142 0 987 B
#7841 ExecuteNonQuery net6.0 1.93μs 2.56ns 9.91ns 0 0 0 1.02 KB
#7841 ExecuteNonQuery netcoreapp3.1 2.63μs 3.06ns 11.9ns 0 0 0 1.02 KB
#7841 ExecuteNonQuery net472 2.8μs 5.35ns 20.7ns 0.148 0.0148 0 987 B
Benchmarks.Trace.ElasticsearchBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master CallElasticsearch net6.0 1.88μs 8.07ns 31.3ns 0 0 0 1.03 KB
master CallElasticsearch netcoreapp3.1 2.27μs 11.4ns 48.5ns 0 0 0 1.03 KB
master CallElasticsearch net472 3.67μs 5.84ns 22.6ns 0.163 0 0 1.04 KB
master CallElasticsearchAsync net6.0 1.83μs 9.22ns 41.2ns 0 0 0 1.01 KB
master CallElasticsearchAsync netcoreapp3.1 2.36μs 12ns 52.4ns 0 0 0 1.08 KB
master CallElasticsearchAsync net472 3.83μs 11.4ns 44.2ns 0.171 0 0 1.1 KB
#7841 CallElasticsearch net6.0 1.7μs 0.908ns 3.52ns 0 0 0 1.03 KB
#7841 CallElasticsearch netcoreapp3.1 2.22μs 11.3ns 55.3ns 0 0 0 1.03 KB
#7841 CallElasticsearch net472 3.42μs 1.85ns 6.68ns 0.154 0 0 1.04 KB
#7841 CallElasticsearchAsync net6.0 1.8μs 4.13ns 16ns 0 0 0 1.01 KB
#7841 CallElasticsearchAsync netcoreapp3.1 2.46μs 2.07ns 8ns 0 0 0 1.08 KB
#7841 CallElasticsearchAsync net472 3.76μs 3.48ns 13.5ns 0.169 0 0 1.1 KB
Benchmarks.Trace.GraphQLBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master ExecuteAsync net6.0 1.86μs 8.2ns 30.7ns 0 0 0 952 B
master ExecuteAsync netcoreapp3.1 2.45μs 1.44ns 5.59ns 0 0 0 952 B
master ExecuteAsync net472 2.54μs 0.72ns 2.79ns 0.139 0 0 915 B
#7841 ExecuteAsync net6.0 1.95μs 8.41ns 31.5ns 0 0 0 952 B
#7841 ExecuteAsync netcoreapp3.1 2.35μs 9.15ns 35.4ns 0 0 0 952 B
#7841 ExecuteAsync net472 2.65μs 3.24ns 12.5ns 0.145 0 0 915 B
Benchmarks.Trace.HttpClientBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendAsync net6.0 6.96μs 6.45ns 24.1ns 0 0 0 2.36 KB
master SendAsync netcoreapp3.1 8.75μs 33.5ns 130ns 0 0 0 2.9 KB
master SendAsync net472 12.2μs 5.3ns 19.1ns 0.489 0 0 3.18 KB
#7841 SendAsync net6.0 6.86μs 1.34ns 4.83ns 0 0 0 2.36 KB
#7841 SendAsync netcoreapp3.1 8.44μs 11.7ns 43.7ns 0 0 0 2.9 KB
#7841 SendAsync net472 12μs 11.7ns 45.4ns 0.481 0 0 3.18 KB
Benchmarks.Trace.Iast.StringAspectsBenchmark - Same speed ✔️ More allocations ⚠️

More allocations ⚠️ in #7841

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark‑net6.0 43.44 KB 54.44 KB 11 KB 25.32%
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark‑netcoreapp3.1 42.73 KB 44.04 KB 1.31 KB 3.07%
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark‑net472 278.53 KB 285.99 KB 7.46 KB 2.68%
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark‑net6.0 278.85 KB 280.98 KB 2.14 KB 0.77%

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master StringConcatBenchmark net6.0 43.8μs 178ns 641ns 0 0 0 43.44 KB
master StringConcatBenchmark netcoreapp3.1 49.7μs 290ns 2.27μs 0 0 0 42.73 KB
master StringConcatBenchmark net472 57.5μs 215ns 832ns 0 0 0 57.34 KB
master StringConcatAspectBenchmark net6.0 494μs 1.71μs 6.16μs 0 0 0 278.85 KB
master StringConcatAspectBenchmark netcoreapp3.1 534μs 1.01μs 3.78μs 0 0 0 275.62 KB
master StringConcatAspectBenchmark net472 412μs 2.25μs 12.5μs 0 0 0 278.53 KB
#7841 StringConcatBenchmark net6.0 43.2μs 196ns 997ns 0 0 0 54.44 KB
#7841 StringConcatBenchmark netcoreapp3.1 48.8μs 189ns 757ns 0 0 0 44.04 KB
#7841 StringConcatBenchmark net472 56.6μs 292ns 1.34μs 0 0 0 57.34 KB
#7841 StringConcatAspectBenchmark net6.0 506μs 2.22μs 8.58μs 0 0 0 280.98 KB
#7841 StringConcatAspectBenchmark netcoreapp3.1 549μs 1.72μs 6.22μs 0 0 0 276.91 KB
#7841 StringConcatAspectBenchmark net472 407μs 2.12μs 10.4μs 0 0 0 285.99 KB
Benchmarks.Trace.ILoggerBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 2.72μs 2.06ns 7.7ns 0 0 0 1.7 KB
master EnrichedLog netcoreapp3.1 3.64μs 6.67ns 25.8ns 0 0 0 1.7 KB
master EnrichedLog net472 4.01μs 3.9ns 13.5ns 0.241 0 0 1.64 KB
#7841 EnrichedLog net6.0 2.69μs 1.09ns 3.92ns 0 0 0 1.7 KB
#7841 EnrichedLog netcoreapp3.1 3.57μs 18ns 84.4ns 0 0 0 1.7 KB
#7841 EnrichedLog net472 3.79μs 3.23ns 12.1ns 0.245 0 0 1.64 KB
Benchmarks.Trace.Log4netBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 124μs 55.1ns 206ns 0 0 0 4.31 KB
master EnrichedLog netcoreapp3.1 128μs 285ns 1.07μs 0 0 0 4.31 KB
master EnrichedLog net472 166μs 104ns 404ns 0 0 0 4.52 KB
#7841 EnrichedLog net6.0 122μs 77.2ns 289ns 0 0 0 4.31 KB
#7841 EnrichedLog netcoreapp3.1 127μs 80ns 310ns 0 0 0 4.31 KB
#7841 EnrichedLog net472 167μs 138ns 534ns 0 0 0 4.52 KB
Benchmarks.Trace.NLogBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 4.95μs 10.8ns 41.7ns 0 0 0 2.26 KB
master EnrichedLog netcoreapp3.1 6.88μs 18.7ns 72.3ns 0 0 0 2.26 KB
master EnrichedLog net472 7.57μs 4.82ns 18ns 0.302 0 0 2.08 KB
#7841 EnrichedLog net6.0 5μs 7.71ns 29.9ns 0 0 0 2.26 KB
#7841 EnrichedLog netcoreapp3.1 6.63μs 19.8ns 76.5ns 0 0 0 2.26 KB
#7841 EnrichedLog net472 7.5μs 3.36ns 12.1ns 0.299 0 0 2.08 KB
Benchmarks.Trace.RedisBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendReceive net6.0 1.93μs 2.15ns 8.06ns 0 0 0 1.2 KB
master SendReceive netcoreapp3.1 2.5μs 10.2ns 39.6ns 0 0 0 1.2 KB
master SendReceive net472 3.12μs 2.91ns 11.3ns 0.186 0 0 1.2 KB
#7841 SendReceive net6.0 1.97μs 9.53ns 41.6ns 0 0 0 1.2 KB
#7841 SendReceive netcoreapp3.1 2.57μs 12.8ns 54.2ns 0 0 0 1.2 KB
#7841 SendReceive net472 3.1μs 2.88ns 11.2ns 0.186 0 0 1.2 KB
Benchmarks.Trace.SerilogBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 4.41μs 0.74ns 2.87ns 0 0 0 1.58 KB
master EnrichedLog netcoreapp3.1 5.61μs 14.2ns 53.1ns 0 0 0 1.63 KB
master EnrichedLog net472 6.62μs 6.18ns 24ns 0.3 0 0 2.03 KB
#7841 EnrichedLog net6.0 4.19μs 11.8ns 45.8ns 0 0 0 1.58 KB
#7841 EnrichedLog netcoreapp3.1 5.51μs 18.5ns 71.8ns 0 0 0 1.63 KB
#7841 EnrichedLog net472 6.64μs 9.15ns 35.4ns 0.297 0 0 2.03 KB
Benchmarks.Trace.SpanBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master StartFinishSpan net6.0 772ns 3.75ns 15ns 0 0 0 576 B
master StartFinishSpan netcoreapp3.1 959ns 5.04ns 24.2ns 0 0 0 576 B
master StartFinishSpan net472 942ns 0.252ns 0.944ns 0.0903 0 0 578 B
master StartFinishScope net6.0 907ns 4.8ns 23.5ns 0 0 0 696 B
master StartFinishScope netcoreapp3.1 1.19μs 5.31ns 20.6ns 0 0 0 696 B
master StartFinishScope net472 1.18μs 1.02ns 3.83ns 0.101 0 0 658 B
#7841 StartFinishSpan net6.0 807ns 3.9ns 15.1ns 0 0 0 576 B
#7841 StartFinishSpan netcoreapp3.1 986ns 3.47ns 13.4ns 0 0 0 576 B
#7841 StartFinishSpan net472 960ns 0.235ns 0.909ns 0.0915 0 0 578 B
#7841 StartFinishScope net6.0 918ns 4.82ns 25ns 0 0 0 696 B
#7841 StartFinishScope netcoreapp3.1 1.2μs 5.94ns 27.2ns 0 0 0 696 B
#7841 StartFinishScope net472 1.14μs 0.218ns 0.817ns 0.103 0 0 658 B
Benchmarks.Trace.TraceAnnotationsBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master RunOnMethodBegin net6.0 1.06μs 0.311ns 1.16ns 0 0 0 696 B
master RunOnMethodBegin netcoreapp3.1 1.42μs 6.98ns 28.8ns 0 0 0 696 B
master RunOnMethodBegin net472 1.46μs 0.247ns 0.925ns 0.101 0 0 658 B
#7841 RunOnMethodBegin net6.0 1.04μs 4.78ns 19.1ns 0 0 0 696 B
#7841 RunOnMethodBegin netcoreapp3.1 1.4μs 7.05ns 32.3ns 0 0 0 696 B
#7841 RunOnMethodBegin net472 1.44μs 0.123ns 0.445ns 0.101 0 0 658 B

@igoragoli igoragoli marked this pull request as ready for review November 19, 2025 09:31
@igoragoli igoragoli requested a review from a team as a code owner November 19, 2025 09:32
Copy link

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

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.

ℹ️ 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".

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!

@igoragoli igoragoli requested a review from andrewlock November 20, 2025 15:04
@igoragoli
Copy link
Contributor Author

igoragoli commented Nov 21, 2025

Microbenchmarks were already not running on tags because they couldn't find an open PR: https://gitlab.ddbuild.io/DataDog/apm-reliability/dd-trace-dotnet/-/jobs/1238672257

But now we enforce it through code, and the job won't even start.

Copy link
Member

@andrewlock andrewlock left a comment

Choose a reason for hiding this comment

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

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants