fix(tests): make sure we include the codeowners tag on all tests#8060
fix(tests): make sure we include the codeowners tag on all tests#8060tonyredondo merged 10 commits intomasterfrom
Conversation
BenchmarksBenchmark execution time: 2026-01-19 13:16:18 Comparing candidate commit abd4266 in PR branch Found 5 performance improvements and 6 performance regressions! Performance is the same for 165 metrics, 16 unstable metrics. scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorMoreComplexBody netcoreapp3.1
scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs net6.0
scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net472
scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net6.0
scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice net472
scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool net6.0
scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark net6.0
scenario:Benchmarks.Trace.SerilogBenchmark.EnrichedLog netcoreapp3.1
scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan net6.0
scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes net6.0
|
Execution-Time Benchmarks Report ⏱️Execution-time results for samples comparing This PR (8060) and master.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Metric | Master (Mean ± 95% CI) | Current (Mean ± 95% CI) | Change | Status |
|---|---|---|---|---|
| .NET Framework 4.8 - Baseline | ||||
| duration | 68.20 ± (68.25 - 68.43) ms | 74.06 ± (74.10 - 74.44) ms | +8.6% | ❌⬆️ |
| .NET Framework 4.8 - Bailout | ||||
| duration | 72.33 ± (72.16 - 72.38) ms | 78.62 ± (78.43 - 78.80) ms | +8.7% | ❌⬆️ |
Full Metrics Comparison
FakeDbCommand
| Metric | Master (Mean ± 95% CI) | Current (Mean ± 95% CI) | Change | Status |
|---|---|---|---|---|
| .NET Framework 4.8 - Baseline | ||||
| duration | 68.20 ± (68.25 - 68.43) ms | 74.06 ± (74.10 - 74.44) ms | +8.6% | ❌⬆️ |
| .NET Framework 4.8 - Bailout | ||||
| duration | 72.33 ± (72.16 - 72.38) ms | 78.62 ± (78.43 - 78.80) ms | +8.7% | ❌⬆️ |
| .NET Framework 4.8 - CallTarget+Inlining+NGEN | ||||
| duration | 1002.46 ± (1007.75 - 1017.31) ms | 1043.98 ± (1043.35 - 1050.01) ms | +4.1% | ✅⬆️ |
| .NET Core 3.1 - Baseline | ||||
| process.internal_duration_ms | 21.82 ± (21.80 - 21.85) ms | 22.94 ± (22.89 - 22.99) ms | +5.1% | ✅⬆️ |
| process.time_to_main_ms | 78.59 ± (78.45 - 78.73) ms | 88.27 ± (87.91 - 88.64) ms | +12.3% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 10.91 ± (10.90 - 10.91) MB | 10.90 ± (10.89 - 10.90) MB | -0.1% | ✅ |
| runtime.dotnet.threads.count | 12 ± (12 - 12) | 12 ± (12 - 12) | +0.0% | ✅ |
| .NET Core 3.1 - Bailout | ||||
| process.internal_duration_ms | 21.83 ± (21.80 - 21.87) ms | 22.98 ± (22.92 - 23.04) ms | +5.3% | ✅⬆️ |
| process.time_to_main_ms | 79.72 ± (79.63 - 79.81) ms | 89.21 ± (88.96 - 89.47) ms | +11.9% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 10.94 ± (10.94 - 10.95) MB | 10.92 ± (10.92 - 10.93) MB | -0.2% | ✅ |
| runtime.dotnet.threads.count | 13 ± (13 - 13) | 13 ± (13 - 13) | +0.0% | ✅ |
| .NET Core 3.1 - CallTarget+Inlining+NGEN | ||||
| process.internal_duration_ms | 241.80 ± (238.51 - 245.08) ms | 237.33 ± (233.55 - 241.11) ms | -1.8% | ✅ |
| process.time_to_main_ms | 468.78 ± (468.25 - 469.31) ms | 499.23 ± (498.47 - 500.00) ms | +6.5% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 48.39 ± (48.37 - 48.42) MB | 48.32 ± (48.29 - 48.34) MB | -0.2% | ✅ |
| runtime.dotnet.threads.count | 28 ± (28 - 28) | 28 ± (28 - 28) | +0.4% | ✅⬆️ |
| .NET 6 - Baseline | ||||
| process.internal_duration_ms | 20.64 ± (20.61 - 20.66) ms | 21.65 ± (21.60 - 21.70) ms | +4.9% | ✅⬆️ |
| process.time_to_main_ms | 68.12 ± (68.00 - 68.25) ms | 75.51 ± (75.31 - 75.70) ms | +10.8% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 10.61 ± (10.60 - 10.61) MB | 10.62 ± (10.62 - 10.62) MB | +0.1% | ✅⬆️ |
| runtime.dotnet.threads.count | 10 ± (10 - 10) | 10 ± (10 - 10) | +0.0% | ✅ |
| .NET 6 - Bailout | ||||
| process.internal_duration_ms | 20.62 ± (20.60 - 20.64) ms | 21.56 ± (21.52 - 21.60) ms | +4.6% | ✅⬆️ |
| process.time_to_main_ms | 69.11 ± (69.05 - 69.17) ms | 76.67 ± (76.46 - 76.87) ms | +10.9% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 10.66 ± (10.65 - 10.66) MB | 10.71 ± (10.71 - 10.71) MB | +0.5% | ✅⬆️ |
| runtime.dotnet.threads.count | 11 ± (11 - 11) | 11 ± (11 - 11) | +0.0% | ✅ |
| .NET 6 - CallTarget+Inlining+NGEN | ||||
| process.internal_duration_ms | 244.21 ± (241.80 - 246.61) ms | 236.72 ± (232.55 - 240.89) ms | -3.1% | ✅ |
| process.time_to_main_ms | 445.79 ± (445.34 - 446.25) ms | 474.44 ± (473.58 - 475.31) ms | +6.4% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 49.08 ± (49.05 - 49.11) MB | 49.03 ± (49.02 - 49.05) MB | -0.1% | ✅ |
| runtime.dotnet.threads.count | 28 ± (28 - 28) | 28 ± (28 - 28) | +0.2% | ✅⬆️ |
| .NET 8 - Baseline | ||||
| process.internal_duration_ms | 18.78 ± (18.75 - 18.81) ms | 19.84 ± (19.80 - 19.88) ms | +5.7% | ✅⬆️ |
| process.time_to_main_ms | 67.21 ± (67.09 - 67.33) ms | 74.62 ± (74.44 - 74.81) ms | +11.0% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 7.65 ± (7.65 - 7.66) MB | 7.67 ± (7.66 - 7.67) MB | +0.2% | ✅⬆️ |
| runtime.dotnet.threads.count | 10 ± (10 - 10) | 10 ± (10 - 10) | +0.0% | ✅ |
| .NET 8 - Bailout | ||||
| process.internal_duration_ms | 18.83 ± (18.80 - 18.85) ms | 19.84 ± (19.78 - 19.90) ms | +5.4% | ✅⬆️ |
| process.time_to_main_ms | 68.47 ± (68.40 - 68.55) ms | 76.23 ± (76.03 - 76.42) ms | +11.3% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 7.71 ± (7.70 - 7.72) MB | 7.74 ± (7.73 - 7.75) MB | +0.3% | ✅⬆️ |
| runtime.dotnet.threads.count | 11 ± (11 - 11) | 11 ± (11 - 11) | +0.0% | ✅ |
| .NET 8 - CallTarget+Inlining+NGEN | ||||
| process.internal_duration_ms | 177.28 ± (176.44 - 178.13) ms | 191.57 ± (190.87 - 192.27) ms | +8.1% | ✅⬆️ |
| process.time_to_main_ms | 428.74 ± (428.08 - 429.40) ms | 458.35 ± (457.63 - 459.07) ms | +6.9% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 0 ± (0 - 0) | 0 ± (0 - 0) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 36.49 ± (36.46 - 36.53) MB | 36.76 ± (36.72 - 36.80) MB | +0.7% | ✅⬆️ |
| runtime.dotnet.threads.count | 27 ± (27 - 27) | 27 ± (27 - 27) | -0.2% | ✅ |
HttpMessageHandler
| Metric | Master (Mean ± 95% CI) | Current (Mean ± 95% CI) | Change | Status |
|---|---|---|---|---|
| .NET Framework 4.8 - Baseline | ||||
| duration | 192.14 ± (191.92 - 192.71) ms | 193.47 ± (193.43 - 194.46) ms | +0.7% | ✅⬆️ |
| .NET Framework 4.8 - Bailout | ||||
| duration | 195.23 ± (194.93 - 195.43) ms | 196.94 ± (196.78 - 197.55) ms | +0.9% | ✅⬆️ |
| .NET Framework 4.8 - CallTarget+Inlining+NGEN | ||||
| duration | 1115.71 ± (1119.45 - 1129.34) ms | 1118.26 ± (1122.88 - 1133.10) ms | +0.2% | ✅⬆️ |
| .NET Core 3.1 - Baseline | ||||
| process.internal_duration_ms | 186.16 ± (185.79 - 186.52) ms | 187.30 ± (186.96 - 187.64) ms | +0.6% | ✅⬆️ |
| process.time_to_main_ms | 80.45 ± (80.26 - 80.64) ms | 81.14 ± (80.95 - 81.33) ms | +0.9% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 3 ± (3 - 3) | 3 ± (3 - 3) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 16.13 ± (16.10 - 16.16) MB | 16.07 ± (16.04 - 16.09) MB | -0.4% | ✅ |
| runtime.dotnet.threads.count | 20 ± (20 - 20) | 20 ± (20 - 20) | -0.7% | ✅ |
| .NET Core 3.1 - Bailout | ||||
| process.internal_duration_ms | 186.36 ± (186.07 - 186.66) ms | 186.16 ± (185.87 - 186.46) ms | -0.1% | ✅ |
| process.time_to_main_ms | 81.59 ± (81.45 - 81.73) ms | 82.04 ± (81.89 - 82.19) ms | +0.6% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 3 ± (3 - 3) | 3 ± (3 - 3) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 16.15 ± (16.12 - 16.17) MB | 16.14 ± (16.11 - 16.17) MB | -0.0% | ✅ |
| runtime.dotnet.threads.count | 21 ± (21 - 21) | 21 ± (21 - 21) | -0.3% | ✅ |
| .NET Core 3.1 - CallTarget+Inlining+NGEN | ||||
| process.internal_duration_ms | 429.31 ± (426.42 - 432.21) ms | 435.96 ± (433.47 - 438.45) ms | +1.5% | ✅⬆️ |
| process.time_to_main_ms | 469.73 ± (469.21 - 470.25) ms | 472.04 ± (471.47 - 472.62) ms | +0.5% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 3 ± (3 - 3) | 3 ± (3 - 3) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 58.82 ± (58.70 - 58.94) MB | 58.75 ± (58.63 - 58.87) MB | -0.1% | ✅ |
| runtime.dotnet.threads.count | 29 ± (29 - 29) | 29 ± (29 - 29) | +0.1% | ✅⬆️ |
| .NET 6 - Baseline | ||||
| process.internal_duration_ms | 190.82 ± (190.38 - 191.26) ms | 191.08 ± (190.78 - 191.37) ms | +0.1% | ✅⬆️ |
| process.time_to_main_ms | 70.07 ± (69.86 - 70.27) ms | 70.02 ± (69.85 - 70.19) ms | -0.1% | ✅ |
| runtime.dotnet.exceptions.count | 4 ± (4 - 4) | 4 ± (4 - 4) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 15.85 ± (15.68 - 16.01) MB | 16.24 ± (16.14 - 16.34) MB | +2.5% | ✅⬆️ |
| runtime.dotnet.threads.count | 18 ± (18 - 18) | 19 ± (18 - 19) | +3.7% | ✅⬆️ |
| .NET 6 - Bailout | ||||
| process.internal_duration_ms | 189.58 ± (189.34 - 189.82) ms | 190.21 ± (189.91 - 190.52) ms | +0.3% | ✅⬆️ |
| process.time_to_main_ms | 70.86 ± (70.74 - 70.98) ms | 71.32 ± (71.17 - 71.46) ms | +0.6% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 4 ± (4 - 4) | 4 ± (4 - 4) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 15.87 ± (15.70 - 16.05) MB | 16.02 ± (15.85 - 16.18) MB | +0.9% | ✅⬆️ |
| runtime.dotnet.threads.count | 19 ± (18 - 19) | 19 ± (19 - 19) | +2.2% | ✅⬆️ |
| .NET 6 - CallTarget+Inlining+NGEN | ||||
| process.internal_duration_ms | 438.58 ± (434.75 - 442.41) ms | 445.18 ± (442.11 - 448.26) ms | +1.5% | ✅⬆️ |
| process.time_to_main_ms | 448.69 ± (448.17 - 449.20) ms | 450.20 ± (449.71 - 450.69) ms | +0.3% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 4 ± (4 - 4) | 4 ± (4 - 4) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 58.77 ± (58.63 - 58.91) MB | 58.90 ± (58.77 - 59.03) MB | +0.2% | ✅⬆️ |
| runtime.dotnet.threads.count | 29 ± (29 - 29) | 29 ± (29 - 29) | -0.0% | ✅ |
| .NET 8 - Baseline | ||||
| process.internal_duration_ms | 188.47 ± (188.17 - 188.77) ms | 189.20 ± (188.91 - 189.48) ms | +0.4% | ✅⬆️ |
| process.time_to_main_ms | 69.13 ± (69.00 - 69.26) ms | 69.41 ± (69.23 - 69.59) ms | +0.4% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 4 ± (4 - 4) | 4 ± (4 - 4) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 11.78 ± (11.74 - 11.83) MB | 11.76 ± (11.73 - 11.79) MB | -0.2% | ✅ |
| runtime.dotnet.threads.count | 18 ± (18 - 18) | 18 ± (18 - 18) | -0.3% | ✅ |
| .NET 8 - Bailout | ||||
| process.internal_duration_ms | 187.96 ± (187.62 - 188.31) ms | 188.35 ± (188.06 - 188.64) ms | +0.2% | ✅⬆️ |
| process.time_to_main_ms | 70.42 ± (70.30 - 70.54) ms | 70.71 ± (70.56 - 70.86) ms | +0.4% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 4 ± (4 - 4) | 4 ± (4 - 4) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 11.82 ± (11.79 - 11.85) MB | 11.76 ± (11.67 - 11.84) MB | -0.5% | ✅ |
| runtime.dotnet.threads.count | 19 ± (19 - 19) | 19 ± (19 - 19) | -0.8% | ✅ |
| .NET 8 - CallTarget+Inlining+NGEN | ||||
| process.internal_duration_ms | 364.26 ± (362.82 - 365.69) ms | 364.73 ± (363.09 - 366.37) ms | +0.1% | ✅⬆️ |
| process.time_to_main_ms | 433.43 ± (432.77 - 434.09) ms | 434.09 ± (433.24 - 434.93) ms | +0.2% | ✅⬆️ |
| runtime.dotnet.exceptions.count | 4 ± (4 - 4) | 4 ± (4 - 4) | +0.0% | ✅ |
| runtime.dotnet.mem.committed | 48.10 ± (48.05 - 48.14) MB | 48.19 ± (48.14 - 48.24) MB | +0.2% | ✅⬆️ |
| runtime.dotnet.threads.count | 29 ± (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 (8060) - mean (74ms) : 72, 77
master - mean (68ms) : 67, 70
section Bailout
This PR (8060) - mean (79ms) : crit, 77, 81
master - mean (72ms) : 71, 73
section CallTarget+Inlining+NGEN
This PR (8060) - mean (1,047ms) : 997, 1096
master - mean (1,013ms) : 943, 1082
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 (8060) - mean (119ms) : 111, 126
master - mean (106ms) : 103, 108
section Bailout
This PR (8060) - mean (119ms) : crit, 114, 125
master - mean (107ms) : 105, 108
section CallTarget+Inlining+NGEN
This PR (8060) - mean (776ms) : 718, 833
master - mean (736ms) : 685, 786
FakeDbCommand (.NET 6)
gantt
title Execution time (ms) FakeDbCommand (.NET 6)
dateFormat x
axisFormat %Q
todayMarker off
section Baseline
This PR (8060) - mean (104ms) : 100, 107
master - mean (94ms) : 92, 96
section Bailout
This PR (8060) - mean (105ms) : crit, 102, 108
master - mean (94ms) : 93, 95
section CallTarget+Inlining+NGEN
This PR (8060) - mean (742ms) : 664, 819
master - mean (715ms) : 680, 750
FakeDbCommand (.NET 8)
gantt
title Execution time (ms) FakeDbCommand (.NET 8)
dateFormat x
axisFormat %Q
todayMarker off
section Baseline
This PR (8060) - mean (102ms) : 99, 106
master - mean (92ms) : 90, 95
section Bailout
This PR (8060) - mean (104ms) : crit, 102, 106
master - mean (93ms) : 92, 95
section CallTarget+Inlining+NGEN
This PR (8060) - mean (685ms) : crit, 658, 712
master - mean (636ms) : 622, 651
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 (8060) - mean (194ms) : 189, 199
master - mean (192ms) : 188, 196
section Bailout
This PR (8060) - mean (197ms) : 193, 201
master - mean (195ms) : 193, 198
section CallTarget+Inlining+NGEN
This PR (8060) - mean (1,128ms) : 1055, 1201
master - mean (1,124ms) : 1053, 1195
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 (8060) - mean (277ms) : 272, 282
master - mean (275ms) : 270, 280
section Bailout
This PR (8060) - mean (276ms) : 272, 281
master - mean (276ms) : 271, 280
section CallTarget+Inlining+NGEN
This PR (8060) - mean (935ms) : 900, 969
master - mean (926ms) : 880, 972
HttpMessageHandler (.NET 6)
gantt
title Execution time (ms) HttpMessageHandler (.NET 6)
dateFormat x
axisFormat %Q
todayMarker off
section Baseline
This PR (8060) - mean (269ms) : 265, 274
master - mean (269ms) : 264, 274
section Bailout
This PR (8060) - mean (269ms) : 265, 273
master - mean (268ms) : 265, 272
section CallTarget+Inlining+NGEN
This PR (8060) - mean (924ms) : 877, 972
master - mean (916ms) : 855, 976
HttpMessageHandler (.NET 8)
gantt
title Execution time (ms) HttpMessageHandler (.NET 8)
dateFormat x
axisFormat %Q
todayMarker off
section Baseline
This PR (8060) - mean (268ms) : 264, 273
master - mean (268ms) : 263, 272
section Bailout
This PR (8060) - mean (268ms) : 264, 273
master - mean (268ms) : 263, 273
section CallTarget+Inlining+NGEN
This PR (8060) - mean (829ms) : 809, 849
master - mean (829ms) : 811, 847
This comment has been minimized.
This comment has been minimized.
…verage Implement a fallback search that anchors to the source file first and then workspace root, while ensuring relative paths do not escape the CODEOWNERS root. Normalize SourceFile tags using the same fallback to keep matching consistent. Expand CODEOWNERS tests with Windows-style paths and fallback edge cases.
tracer/src/Datadog.Trace/Ci/CiEnvironment/CIEnvironmentValues.cs
Outdated
Show resolved
Hide resolved
…nstance.IsWindows()
Summary of changes
Reason for change
Implementation details
Test coverage
Other details