Skip to content

[Perf] Windows/x64: 5 Regressions on 7/30/2026 6:50:50 PM +00:00 #131813

Closed

Description

@performanceautofiler

Run Information

Name Value
Architecture x64
OS Windows 10.0.22631
Queue ViperWindows
Baseline 72dac24a0e6fa1047002858a762f36c88e53850b
Compare 640b326fc81d94d410753b67c0f89b166d6666df
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in MicroBenchmarks.Serializers.Xml_FromStream<MyEventsListerViewModel>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio
502.21 μs 722.46 μs 1.44 0.00 False

graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'MicroBenchmarks.Serializers.Xml_FromStream<MyEventsListerViewModel>*'
Details

MicroBenchmarks.Serializers.Xml_FromStream<MyEventsListerViewModel>.XmlSerializer_

ETL Files

Histogram

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.22631
Queue ViperWindows
Baseline 72dac24a0e6fa1047002858a762f36c88e53850b
Compare 640b326fc81d94d410753b67c0f89b166d6666df
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in MicroBenchmarks.Serializers.Xml_FromStream<SimpleStructWithProperties>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio
2.88 μs 3.26 μs 1.13 0.00 False

graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'MicroBenchmarks.Serializers.Xml_FromStream<SimpleStructWithProperties>*'
Details

MicroBenchmarks.Serializers.Xml_FromStream<SimpleStructWithProperties>.XmlSerializer_

ETL Files

Histogram

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.22631
Queue ViperWindows
Baseline 72dac24a0e6fa1047002858a762f36c88e53850b
Compare 640b326fc81d94d410753b67c0f89b166d6666df
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in MicroBenchmarks.Serializers.Xml_FromStream<IndexViewModel>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio
45.81 μs 70.63 μs 1.54 0.00 False

graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'MicroBenchmarks.Serializers.Xml_FromStream<IndexViewModel>*'
Details

MicroBenchmarks.Serializers.Xml_FromStream<IndexViewModel>.XmlSerializer_

ETL Files

Histogram

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.22631
Queue ViperWindows
Baseline 72dac24a0e6fa1047002858a762f36c88e53850b
Compare 640b326fc81d94d410753b67c0f89b166d6666df
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in MicroBenchmarks.Serializers.Xml_FromStream<CollectionsOfPrimitives>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio
324.35 μs 623.69 μs 1.92 0.02 False

graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'MicroBenchmarks.Serializers.Xml_FromStream<CollectionsOfPrimitives>*'
Details

MicroBenchmarks.Serializers.Xml_FromStream<CollectionsOfPrimitives>.XmlSerializer_

ETL Files

Histogram

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository


Run Information

Name Value
Architecture x64
OS Windows 10.0.22631
Queue ViperWindows
Baseline 72dac24a0e6fa1047002858a762f36c88e53850b
Compare 640b326fc81d94d410753b67c0f89b166d6666df
Diff Diff
Configs CompilationMode:tiered, RunKind:micro

Regressions in MicroBenchmarks.Serializers.Xml_FromStream<Location>

Benchmark Baseline Test Test/Base Test Quality Edge Detector Baseline IR Compare IR IR Ratio
4.12 μs 5.36 μs 1.30 0.01 False

graph
Test Report

Repro

General Docs link: https://github.com/dotnet/performance/blob/main/docs/benchmarking-workflow-dotnet-runtime.md

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net8.0 --filter 'MicroBenchmarks.Serializers.Xml_FromStream<Location>*'
Details

MicroBenchmarks.Serializers.Xml_FromStream<Location>.XmlSerializer_

ETL Files

Histogram

JIT Disasms

Docs

Profiling workflow for dotnet/runtime repository
Benchmarking workflow for dotnet/runtime repository

Activity

  1. LoopedBard3 commented on Aug 4, 2026

    @LoopedBard3
    Member

    🔍 Automated Triage Analysis

    Summary: Verified regression in XmlSerializer_ — caused by commit efe647b ("XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed ele"). 3 tests bisected to related culprit commits. 2 other test(s) found unrelated commits (possible alignment artifacts).

    Finding Confidence: 5/5 (analysis accuracy)
    Regression Confidence: 5/5 (likelihood of true regression)

    Likely Cause: efe647b7aa3928130fa2a24069a397d3b8c9cbe4

    🤖 Proposed Next Actions: Known-cause regression — transfer & notify — 0 done, 3 dry-run (rule R4_known_regression_new — see Full Analysis for the table). · 🦆 Re-analysis: ⚠️ disputes (overconfident, alignment-warning, partial-bisection-divergence)

    📊 Full Analysis (click to expand)

    Summary: All 5 reported MicroBenchmarks.Serializers.Xml_FromStream<T>.XmlSerializer_ deserialization benchmarks are confirmed regressions (+13% to +92%), each a clean non-overlapping step change over 296–300 stable prior runs (z = 9.0–71.6). The shared deserialization slowdown is attributed to commit efe647b (PR #131302, "XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements"), which adds per-attribute checking to the XmlSerializationReader read paths exercised by every affected test. Finding confidence 4/5 (300 runs, very low variance, not yet rerun-verified); regression confidence 5/5 (surgical direct code hit on the tested path, extreme z-scores, clean step change).

    Issue Overview

    • Issue: [Perf] Windows/x64: 5 Regressions on 7/30/2026 6:50:50 PM +00:00 #131813 - [Perf] Windows/x64: 5 Regressions on 7/30/2026 6:50:50 PM +00:00
    • Date: 2026-07-30 | Queue: Windows.11.Amd64.Viper.Perf (ViperWindows) | OS/Arch: Windows 10.0.22631/x64
    • Commits: 72dac24 → 640b326 (29 commits)
    • Labels: untriaged, perf-regression, os-windows, arch-x64, branch-refs/heads/main, runtime-coreclr, kind-micro, compilationmode-tiered, runkind-micro
    • Runtime stack: Desktop + CoreCLR (implicit); the regressed code is BCL (System.Private.Xml), which is directly the code under test.
    • Historical Data: Available (296–300 prior runs per test; 20 after-runs each; no pre-existing drift)

    Test Analysis

    Test Name Baseline Compare Δ% μ σ n z Thresh% Noise? Assessment
    Xml_FromStream<MyEventsListerViewModel>.XmlSerializer_ 502.21 μs 722.46 μs +43.86% 507.57 μs 6.91 μs 300 31.08 5% N Step change, stable (CV 1.36%)
    Xml_FromStream<SimpleStructWithProperties>.XmlSerializer_ 2.88 μs 3.26 μs +13.06% 2.96 μs 0.033 μs 299 8.96 5% N Step change, stable (CV 1.12%)
    Xml_FromStream<IndexViewModel>.XmlSerializer_ 45.81 μs 70.63 μs +54.17% 46.05 μs 0.34 μs 296 71.55 5% N Extreme step change, very stable (CV 0.75%)
    Xml_FromStream<CollectionsOfPrimitives>.XmlSerializer_ 324.35 μs 623.69 μs +92.29% 326.77 μs 4.87 μs 300 61.02 5% N Extreme step change (~2×), stable (CV 1.49%)
    Xml_FromStream<Location>.XmlSerializer_ 4.12 μs 5.36 μs +30.22% 4.12 μs 0.043 μs 299 28.56 5% N Extreme step change, stable (CV 1.05%)

    Legend: μ=mean, σ=stddev, n=runs, z=z-score, Thresh%=adaptive threshold

    Finding Confidence: 4/5 - Exceptionally strong historical baseline (296–300 runs), very low variance (CV 0.75–1.49%), fully non-overlapping before/after distributions, no pre-existing drift. Not upgraded to 5 because no RunWithBuildAtHash rerun or bisection has been performed yet.

    Candidate Stack Relevance

    Commit Touched Paths (summary) Relevance Notes
    efe647b src/libraries/System.Private.Xml/src/System/Xml/Serialization/{XmlSerializationReader,ReflectionXmlSerializationReader,XmlSerializationReaderILGen}.cs Relevant Direct hit on the exact XmlSerializer deserialization read path exercised by every Xml_FromStream<T>.XmlSerializer_ benchmark.
    5f971a6 src/libraries/System.Text.Json/... (ReflectionMemberAccessor) LessLikely System.Text.Json only; these benchmarks use XmlSerializer, not STJ.
    59c7521 src/libraries/System.Text.Json/... (new converters) LessLikely STJ-only; unrelated to XML deserialization.
    640b326 src/libraries/Common/src/System/Number.Parsing.Common.cs LessLikely Number parsing fix; not on the XmlSerializer object-graph read path.

    Confirmed Regressions

    All five regressions share the same code path and the same likely cause. Details are grouped; per-test deltas are in the Test Analysis table above.

    Xml_FromStream<CollectionsOfPrimitives>.XmlSerializer_ (+92.3%) — highest severity

    • Delta: 324.35 μs → 623.69 μs (+92.29%)
    • Historical Context: μ=326.77 μs (σ=4.87 μs, n=300); z-score=61.02; adaptive threshold=5%
    • Assessment: Extreme step change; after-values (612K–628K ns) roughly double a stable historical baseline with zero overlap.
    • Finding Confidence: 4/5 - 300 runs, CV 1.49%, clean non-overlapping distributions.
    • Regression Confidence: 5/5 - Surgical, direct code-path change; extreme outlier (z≫3); stable history.
    • Likely Cause: efe647b - "XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements (XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements #131302)"
      • Affected Areas: Serialization (System.Private.Xml / XmlSerializer deserialization reader)
      • Stack Relevance: Relevant
      • Rationale: The commit adds new per-attribute inspection logic to XmlSerializationReader.cs (+28), ReflectionXmlSerializationReader.cs (+25), and XmlSerializationReaderILGen.cs (+98) — the exact deserialization read paths driven by Xml_FromStream<T>.XmlSerializer_. Firing UnknownAttribute for stray attributes on built-in typed elements introduces additional attribute enumeration/checking per element during read, which explains a uniform slowdown across all payload shapes (struct, view models, collections). It is the only commit in the 29-commit range that touches XmlSerializer deserialization.
      • Candidates Considered:
        • 5f971a6 - System.Text.Json method-invocation optimization; wrong serializer.
        • 640b326 - UTF-8 number-separator OOB fix; not on the XML object read path.
    • Verification Status: Not verified (rerun/bisection to be performed separately)

    Xml_FromStream<IndexViewModel>.XmlSerializer_ (+54.2%)

    • Delta: 45.81 μs → 70.63 μs (+54.17%)
    • Historical Context: μ=46.05 μs (σ=0.34 μs, n=296); z-score=71.55; adaptive threshold=5%
    • Assessment: Extreme step change; historically the most stable test (CV 0.75%), no overlap.
    • Finding Confidence: 4/5
    • Regression Confidence: 5/5 - Direct code-path change; z=71.6.
    • Likely Cause: efe647b (XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements #131302) — same rationale as above (Stack Relevance: Relevant).
    • Verification Status: Not verified

    Xml_FromStream<MyEventsListerViewModel>.XmlSerializer_ (+43.9%)

    Xml_FromStream<Location>.XmlSerializer_ (+30.2%)

    Xml_FromStream<SimpleStructWithProperties>.XmlSerializer_ (+13.1%)

    • Delta: 2.88 μs → 3.26 μs (+13.06%)
    • Historical Context: μ=2.96 μs (σ=0.033 μs, n=299); z-score=8.96; adaptive threshold=5%
    • Assessment: Step change; smallest relative delta but still fully non-overlapping (before 2744–3058 ns, after 3204–3287 ns).
    • Finding Confidence: 4/5
    • Regression Confidence: 5/5 - Above threshold, z=9.0, corroborated by the four sibling tests.
    • Likely Cause: efe647b (XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements #131302) — same rationale (Stack Relevance: Relevant).
    • Verification Status: Not verified

    Open Questions

    • Historical Data: Complete and high-quality — 296–300 prior runs per test, no pre-existing drift, non-overlapping distributions.
    • Confidence Limitations: Commit range is 29, but attribution is a direct code hit on the tested path, so ambiguity is low. Absolute confirmation still pending a rerun.
    • Verification Needed: Confirm via RunWithBuildAtHash comparing the parent of efe647b against efe647b on one high-severity test (e.g., CollectionsOfPrimitives). Bisection is optional given the single obvious candidate.
    • Bisection Status: Not performed.

    Recommended Actions

    1. Verify likely cause - Run RunWithBuildAtHash on MicroBenchmarks.Serializers.Xml_FromStream<CollectionsOfPrimitives>.XmlSerializer_ at efe647b vs its parent to confirm the ~2× jump.
    2. Source review - Manual review of PR XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements #131302's added attribute-inspection logic in XmlSerializationReader.cs / ReflectionXmlSerializationReader.cs / XmlSerializationReaderILGen.cs; assess whether the UnknownAttribute check can be short-circuited when no stray attributes are present (fast path) to eliminate the per-element overhead.
    3. Follow-up - Notify the PR XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements #131302 author/area owners (System.Private.Xml) of the deserialization regression across all Xml_FromStream<T> payload shapes.

    Bisection Results

    Test Status Culprit Commit Relevance Reported Diff (issue) Bisected Diff (at culprit)
    XmlSerializer_ ✅ Culprit found efe647b7aa39 ⚠️ RELATED 502.2→722.5 μs (+44%) 497.2→734.2 μs (+48%)
    XmlSerializer_ ✅ Culprit found 3965f5ce78a5 ⚠️ UNRELATED 2.9→3.3 μs (+13%) 3.0→3.3 μs (+9%)
    XmlSerializer_ ✅ Culprit found efe647b7aa39 ✅ RELATED 45.8→70.6 μs (+54%) 46.0→70.6 μs (+54%)
    XmlSerializer_ ✅ Culprit found efe647b7aa39 ✅ RELATED 324.3→623.7 μs (+92%) 324.3→624.4 μs (+93%)
    XmlSerializer_ ✅ Culprit found efe647b7aa39 ✅ RELATED 4.1→5.4 μs (+30%) 4.1→5.4 μs (+30%)

    Total bisection time: 2108s
    Tests measured: 5/5
    Culprit found: 5/5

    ⚠️ Alignment Warning

    Bisection found commits that are unrelated to the regressed tests. This strongly suggests the performance changes are caused by code alignment, binary layout, or other non-functional factors rather than actual regressions. Consider marking as noise.

    MicroBenchmarks.Serializers.Xml_FromStream.XmlSerializer_

    • Culprit: efe647b7aa39
    • Commit Message: XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements (XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements #131302)
    • Relevance: RELATED
    • Explanation: The commit modifies the XmlSerializer deserialization readers (ReflectionXmlSerializationReader, XmlSerializationReaderILGen — the default runtime reader, and XmlSerializationReader/sgen), adding a new HandleUnknownAttributes() attribute-walk into the primitive/array/collection read paths. The benchmark Xml_FromStream.XmlSerializer_ deserializes a model full of primitive/collection members through exactly these readers, so the extra per-element attribute enumeration directly lands on the hot deserialization path. This is a clear functional mechanism for the +43.9% slowdown, not a layout artifact.
    • ⚠️ This commit is UNRELATED to the test — likely a code alignment artifact

    Helix jobs

    Job ID Submitted by bisection Last status
    f4d4659c-d949-44b8-878a-f1753ea66e3b ✅ submitted
    ed1dadc4-582e-4679-88e2-e4e4b52a988b ✅ submitted
    69dd242b-b6bf-492e-92fd-4c92ec71292b ✅ completed

    Per-commit measurements

    Commit Position Measurements
    72dac24a0e6f baseline / good 501.850 μs
    ac605351eff9 index7 / good 503.054 μs
    974b4b56b05f index17 / bad 723.468 μs
    4a38c7bd33cd index19 / bad 725.892 μs
    1e48ed63cfe6 index21 / bad 731.484 μs
    bdfac9aa0da8 index22 / bad 748.313 μs
    3965f5ce78a5 index15 / last-good, culprit parent 497.168 μs
    640b326fc81d head / regressed 724.572 μs
    efe647b7aa39 index16 / culprit, first-bad 734.245 μs
    Bisection details

    …[earlier output omitted]

    647b7aa3928130fa2a24069a397d3b8c9cbe4
    - Commit Message: XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements (#131302)
    - Commits Tested: 9
    - Confidence: 5
    - Commit Relevance: RELATED
    - Relevance Explanation: The commit modifies the XmlSerializer deserialization readers (ReflectionXmlSerializationReader, XmlSerializationReaderILGen — the default runtime reader, and XmlSerializationReader/sgen), adding a new HandleUnknownAttributes() attribute-walk into the primitive/array/collection read paths. The benchmark Xml_FromStream<MyEventsListerViewModel>.XmlSerializer_ deserializes a model full of primitive/collection members through exactly these readers, so the extra per-element attribute enumeration directly lands on the hot deserialization path. This is a clear functional mechanism for the +43.9% slowdown, not a layout artifact.
    - Baseline Value: 497168.4 ns
    - Culprit Value: 734245.2 ns
    - Summary: Bisected a 29-commit range with Helix runs of the default tiered-JIT coreclr config. The endpoints plus quadrant commits localized the step change to indices 15–16; measuring the parent (3965f5ce, 497µs, good) and the culprit (efe647b7, 734µs, regressed) pinned the single introducing commit. Separation is ~237µs, far beyond the ~13.8µs 2σ noise floor.
    
    HELIX JOBS:
    - f4d4659c-d949-44b8-878a-f1753ea66e3b
    - ed1dadc4-582e-4679-88e2-e4e4b52a988b
    - 69dd242b-b6bf-492e-92fd-4c92ec71292b
    
    MEASUREMENTS:
    - 72dac24a0e6f (baseline / good): 501850.4 ns
    - ac605351eff9 (index7 / good): 503053.8 ns
    - 3965f5ce78a5 (index15 / last-good, culprit parent): 497168.4 ns
    - efe647b7aa39 (index16 / culprit, first-bad): 734245.2 ns
    - 974b4b56b05f (index17 / bad): 723468.2 ns
    - 4a38c7bd33cd (index19 / bad): 725892.0 ns
    - 1e48ed63cfe6 (index21 / bad): 731483.8 ns
    - bdfac9aa0da8 (index22 / bad): 748312.8 ns
    - 640b326fc81d (head / regressed): 724571.9 ns
    

    Bisection complete. The culprit is a genuine, functionally-related XmlSerializer change — no alignment warning needed.

    MicroBenchmarks.Serializers.Xml_FromStream.XmlSerializer_

    • Culprit: 3965f5ce78a5
    • Commit Message: Escape C# keyword identifiers in Configuration Binder source generator (Escape C# keyword identifiers in Configuration Binder source generator #131453)
    • Relevance: UNRELATED
    • Explanation: The commit only modifies the Microsoft.Extensions.Configuration.Binder source generator (CoreBindingHelpers.cs / Helpers.cs) and its tests, adding C# keyword-identifier escaping. The regressed test, MicroBenchmarks.Serializers.Xml_FromStream.XmlSerializer_, exercises System.Xml XmlSerializer deserialization and never touches Configuration.Binder code. There is no plausible mechanism connecting this source-generator change to the XML serialization hot path, so the ~9% step change is almost certainly a code-alignment / binary-layout artifact.
    • ⚠️ This commit is UNRELATED to the test — likely a code alignment artifact

    Helix jobs

    Job ID Submitted by bisection Last status
    de6f674d-77d2-44ad-af50-c49ad4c01b84 ✅ submitted
    62ec83ff-815b-4c8c-91cd-5873a35aed8b ✅ submitted

    Per-commit measurements

    Commit Position Measurements
    72dac24a0e6f baseline 2.940 μs
    490a2b069df7 idx7, good 2.899 μs
    59c7521855c2 idx9, good 2.960 μs
    fdccdc695479 idx11, good 2.979 μs
    0b4b5f2a1f7d idx13, last-good 2.984 μs
    3965f5ce78a5 idx14, culprit 3.254 μs
    640b326fc81d head, regressed 3.204 μs
    Bisection details

    …[earlier output omitted]

    - Commits Tested: 8
    - Confidence: 3
    - Commit Relevance: UNRELATED
    - Relevance Explanation: The commit only modifies the Microsoft.Extensions.Configuration.Binder source generator (CoreBindingHelpers.cs / Helpers.cs) and its tests, adding C# keyword-identifier escaping. The regressed test, MicroBenchmarks.Serializers.Xml_FromStream<SimpleStructWithProperties>.XmlSerializer_, exercises System.Xml XmlSerializer deserialization and never touches Configuration.Binder code. There is no plausible mechanism connecting this source-generator change to the XML serialization hot path, so the ~9% step change is almost certainly a code-alignment / binary-layout artifact.
    - Baseline Value: 2983.5 ns   (measured at last-good commit 0b4b5f2a1f7d)
    - Culprit Value: 3253.7 ns    (measured at culprit commit 3965f5ce78a5)
    - Summary: A 5-commit sweep across the range located the step change between idx7 (good, 2898 ns) and idx14 (bad, 3253 ns); a second job on interior commits idx9/idx11/idx13 showed all still at baseline (~2960–2983 ns), isolating the regression to the single commit 3965f5 (idx13 good → idx14 bad). The ~270 ns step is well above the 2σ noise floor (~66 ns), but confidence is capped at 3/5 because measurements are single-sample and the culprit has no functional link to the test.
    
    HELIX JOBS:
    - de6f674d-77d2-44ad-af50-c49ad4c01b84
    - 62ec83ff-815b-4c8c-91cd-5873a35aed8b
    
    MEASUREMENTS:
    - 72dac24a0e6f (baseline): 2939.6 ns
    - 490a2b069df7 (idx7, good): 2898.8 ns
    - 59c7521855c2 (idx9, good): 2960.2 ns
    - fdccdc695479 (idx11, good): 2978.7 ns
    - 0b4b5f2a1f7d (idx13, last-good): 2983.5 ns
    - 3965f5ce78a5 (idx14, culprit): 3253.7 ns
    - bdfac9aa0da8 (idx21, no result): failed
    - 640b326fc81d (head, regressed): 3203.9 ns
    

    ALIGNMENT WARNING:
    This bisection found a commit that does not appear related to the regression test.
    This suggests the performance change may be due to code alignment, binary layout,
    or other non-functional factors rather than a regression in the tested code path.

    MicroBenchmarks.Serializers.Xml_FromStream.XmlSerializer_

    • Culprit: efe647b7aa39
    • Commit Message: XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements (XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements #131302)
    • Relevance: RELATED
    • Explanation: The commit modifies System.Private.Xml's XmlSerializer deserialization readers (ReflectionXmlSerializationReader, XmlSerializationReaderILGen, XmlSerializationReader) to walk element attributes and raise UnknownNode/UnknownAttribute for primitive/array/collection elements. This adds per-element attribute iteration directly on the hot read path exercised by Xml_FromStream.XmlSerializer_, providing a clear mechanism for the +54% deserialization slowdown. Its parent (3965f5c) measured good and this commit measured bad.

    Helix jobs

    Job ID Submitted by bisection Last status
    de6bb88b-7aaf-4d5b-bc85-569e33ab2e6d ✅ submitted
    9bcca097-fcde-416e-8fce-c57fac1721cb ✅ submitted
    6b447610-cce2-4933-892d-77fbc59d7700 ✅ submitted

    Per-commit measurements

    Commit Position Measurements
    72dac24a0e6f baseline, idx0 45.781 μs
    ac605351eff9 idx7 45.516 μs
    3965f5ce78a5 idx15, last-good/parent 45.956 μs
    974b4b56b05f idx17 70.385 μs
    4a38c7bd33cd idx19 70.651 μs
    1e48ed63cfe6 idx21 70.867 μs
    bdfac9aa0da8 idx22 70.386 μs
    640b326fc81d head, idx29 70.040 μs
    efe647b7aa39 idx16, culprit 70.572 μs
    Bisection details

    …[earlier output omitted]

    BISECTION RESULT:
    - Culprit Commit: efe647b7aa3928130fa2a24069a397d3b8c9cbe4
    - Commit Message: XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements (#131302)
    - Commits Tested: 9
    - Confidence: 5
    - Commit Relevance: RELATED
    - Relevance Explanation: The commit modifies System.Private.Xml's XmlSerializer deserialization readers (ReflectionXmlSerializationReader, XmlSerializationReaderILGen, XmlSerializationReader) to walk element attributes and raise UnknownNode/UnknownAttribute for primitive/array/collection elements. This adds per-element attribute iteration directly on the hot read path exercised by Xml_FromStream<IndexViewModel>.XmlSerializer_, providing a clear mechanism for the +54% deserialization slowdown. Its parent (3965f5ce) measured good and this commit measured bad.
    - Baseline Value: 45956.1 ns
    - Culprit Value: 70571.9 ns
    - Summary: Bisected the 29-commit range with a quadrant sweep (baseline/idx7/idx15/idx22/head), localized the step change to indices 16–22, then narrowed via idx17/19/21 (all bad) and finally tested idx16 (efe647b7, bad) against its parent idx15 (3965f5ce, good) to isolate the single culprit.
    
    HELIX JOBS:
    - de6bb88b-7aaf-4d5b-bc85-569e33ab2e6d
    - 9bcca097-fcde-416e-8fce-c57fac1721cb
    - 6b447610-cce2-4933-892d-77fbc59d7700
    
    MEASUREMENTS:
    - 72dac24a0e6f (baseline, idx0): 45781.0 ns
    - ac605351eff9 (idx7): 45516.4 ns
    - 3965f5ce78a5 (idx15, last-good/parent): 45956.1 ns
    - efe647b7aa39 (idx16, culprit): 70571.9 ns
    - 974b4b56b05f (idx17): 70384.6 ns
    - 4a38c7bd33cd (idx19): 70650.5 ns
    - 1e48ed63cfe6 (idx21): 70866.8 ns
    - bdfac9aa0da8 (idx22): 70385.9 ns
    - 640b326fc81d (head, idx29): 70040.1 ns
    

    MicroBenchmarks.Serializers.Xml_FromStream.XmlSerializer_

    • Culprit: efe647b7aa39
    • Commit Message: XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements (XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements #131302)
    • Relevance: RELATED
    • Explanation: The commit adds a new HandleUnknownAttributes() attribute-walking loop into the primitive, array, and collection read paths of XmlSerializer's reflection and IL-gen readers — precisely the code path exercised by Xml_FromStream.XmlSerializer_. This extra per-element attribute enumeration runs on the hot deserialization path for every collection/primitive element, providing a clear mechanism for the ~2× slowdown. The regression appears exactly at this commit (324→624 µs) with the immediately preceding commit still good.

    Helix jobs

    Job ID Submitted by bisection Last status
    18ed372f-97a6-48d6-9417-0184f28654c4 ✅ submitted
    2925627b-6d89-43c6-b30f-48683e7cff9a ✅ submitted

    Per-commit measurements

    Commit Position Measurements
    72dac24a0e6f base, good 331.800 μs
    ac605351eff9 idx7, good 321.300 μs
    3965f5ce78a5 idx15, last-good 324.300 μs
    974b4b56b05f idx17, bad 623.500 μs
    719a5c7e1c7c idx18, bad 627.800 μs
    4a38c7bd33cd idx19, bad 625.800 μs
    5b3683bc150d idx20, bad 630.900 μs
    1e48ed63cfe6 idx21, bad 610.700 μs
    bdfac9aa0da8 idx22, bad 617.500 μs
    640b326fc81d head, bad 620.900 μs
    efe647b7aa39 idx16, culprit 624.400 μs
    Bisection details

    …[earlier output omitted]

    BISECTION RESULT:
    - Culprit Commit: efe647b7aa3928130fa2a24069a397d3b8c9cbe4
    - Commit Message: XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements (#131302)
    - Commits Tested: 11
    - Confidence: 5
    - Commit Relevance: RELATED
    - Relevance Explanation: The commit adds a new HandleUnknownAttributes() attribute-walking loop into the primitive, array, and collection read paths of XmlSerializer's reflection and IL-gen readers — precisely the code path exercised by Xml_FromStream<CollectionsOfPrimitives>.XmlSerializer_. This extra per-element attribute enumeration runs on the hot deserialization path for every collection/primitive element, providing a clear mechanism for the ~2× slowdown. The regression appears exactly at this commit (324→624 µs) with the immediately preceding commit still good.
    - Baseline Value: 324.3 us
    - Culprit Value: 624.4 us
    - Summary: A first Helix job over baseline, three quadrant midpoints, and head localized the regression between idx15 (3965f5ce, 324 µs, good) and idx22 (bdfac9aa, 617 µs, bad); a second job testing all six intermediate commits (idx16–21) showed every one was already regressed (~610–630 µs), pinning the culprit to the first bad commit efe647b7 whose parent (3965f5ce) was the last good commit.
    
    HELIX JOBS:
    - 18ed372f-97a6-48d6-9417-0184f28654c4
    - 2925627b-6d89-43c6-b30f-48683e7cff9a
    
    MEASUREMENTS:
    - 72dac24a0e6f (base, good): 331.8 us
    - ac605351eff9 (idx7, good): 321.3 us
    - 3965f5ce78a5 (idx15, last-good): 324.3 us
    - efe647b7aa39 (idx16, culprit): 624.4 us
    - 974b4b56b05f (idx17, bad): 623.5 us
    - 719a5c7e1c7c (idx18, bad): 627.8 us
    - 4a38c7bd33cd (idx19, bad): 625.8 us
    - 5b3683bc150d (idx20, bad): 630.9 us
    - 1e48ed63cfe6 (idx21, bad): 610.7 us
    - bdfac9aa0da8 (idx22, bad): 617.5 us
    - 640b326fc81d (head, bad): 620.9 us
    

    MicroBenchmarks.Serializers.Xml_FromStream.XmlSerializer_

    • Culprit: efe647b7aa39
    • Commit Message: XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements (XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements #131302)
    • Relevance: RELATED
    • Explanation: The commit modifies the exact XmlSerializer deserialization read path (ReflectionXmlSerializationReader / XmlSerializationReaderILGen) exercised by this Xml_FromStream.XmlSerializer benchmark. It adds a new HandleUnknownAttributes step that walks every element's attributes on the primitive, array, and collection read paths — extra per-element work directly in the deserialization hot path. This is a clear, plausible mechanism for the +30% slowdown, and the step change lands precisely at this commit.

    Helix jobs

    Job ID Submitted by bisection Last status
    c27cdbd3-87df-481e-9dc4-4225a2c5bf06 ✅ submitted
    18317734-42dd-455d-a7c5-8ee53801e0f9 ✅ submitted
    dc348fed-3d3c-43ae-9422-75fe39321fba ✅ completed

    Per-commit measurements

    Commit Position Measurements
    72dac24a0e6f baseline 4.057 μs
    490a2b069df7 q1 midpoint, good 4.074 μs
    1e48ed63cfe6 q3, bad 5.392 μs
    4a38c7bd33cd q3, bad 5.385 μs
    974b4b56b05f q3, bad 5.379 μs
    3965f5ce78a5 mid / culprit parent, good 4.131 μs
    640b326fc81d head, bad 5.347 μs
    bdfac9aa0da8 threequarter, bad 5.387 μs
    efe647b7aa39 culprit, bad 5.358 μs
    Bisection details

    …[earlier output omitted]

    - Baseline Value: 4130.788 ns   (parent commit 3965f5ce78a5, measured)
    - Culprit Value: 5358.199 ns    (culprit commit efe647b7aa39, measured)
    - Summary: Double-bisected the 29-commit range with Helix runs. The step landed in Q3: 3965f5ce (idx14) was good (~4131 ns) while 974b4b56/4a38c7bd/1e48ed63 (idx16/18/20) and bdfac9aa (idx21) were all bad (~5385 ns). A final run at the only untested boundary commit efe647b7 (idx15) measured 5358 ns, pinning it as the first bad commit — directly adjacent to its good parent.
    
    HELIX JOBS:
    - c27cdbd3-87df-481e-9dc4-4225a2c5bf06
    - 18317734-42dd-455d-a7c5-8ee53801e0f9
    - dc348fed-3d3c-43ae-9422-75fe39321fba
    
    MEASUREMENTS:
    - 72dac24a0e6f (baseline): 4056.798 ns
    - 490a2b069df7 (Q1 midpoint, good): 4074.354 ns
    - 3965f5ce78a5 (mid / culprit parent, good): 4130.788 ns
    - efe647b7aa39 (culprit, bad): 5358.199 ns
    - 974b4b56b05f (Q3, bad): 5379.164 ns
    - 4a38c7bd33cd (Q3, bad): 5385.017 ns
    - 1e48ed63cfe6 (Q3, bad): 5391.594 ns
    - bdfac9aa0da8 (threeQuarter, bad): 5387.398 ns
    - 640b326fc81d (head, bad): 5346.590 ns
    

    The regression step (~1225 ns) is roughly 14× the 2σ noise floor (≈86.7 ns), so the single-sample measurements are statistically decisive here — confidence is not tempered by variance. Cleaning up temp files.

    ● Remove temp output files (shell)
    │ rm -f /tmp/1785857537584-copilot-tool-output-677631.txt
    │ /tmp/1785858180079-copilot-tool-output-7143ed.txt
    └ 1 line…

    Bisection complete. The culprit is efe647b (PR #131302, "XmlSerializer - Fire UnknownAttribute for stray attributes on built-in typed elements"), which adds per-element attribute-walking directly to the XmlSerializer deserialization read path exercised by this benchmark — a clear mechanism for the +30% regression. Confidence 5/5; the step change is ~14× the noise floor.

    🤖 Proposed Next Actions

    Rule: R4_known_regression_new — Known-cause regression — transfer & notify.

    Verified regression attributed to commit efe647b (finding 5/5, regression 5/5, bisection RELATED). No prior linked autofile issue found.

    # Action Status Details
    1 Back-reference cause PR ⏭️ Skipped (dry-run) on culprit PR for efe647b7aa39
    2 Transfer issue ⏭️ Skipped (dry-run) → dotnet/runtime
    3 Ping owners ⏭️ Skipped (dry-run) ping StephenMolloy

    🦆 Pre-bisection Re-analysis (advisory)

    ✅ Agrees with the pre-bisection plan — advisory only, not applied

    Rationale: All five findings are non-noise with high change confidence (5/5), relevant stacks, and a consistent likely culprit (efe647b), so the actionable classification is sound and every queued test matches a strongly-regressed finding. The candidate set exactly mirrors the actionable signal with no noisy tests to drop or regressed tests missing.

    This critique is advisory in the current configuration and did not change which tests were bisected.

    🦆 Re-analysis (advisory)

    ⚠️ Disputes the analysis — advisory only, not applied

    Flags: overconfident, alignment-warning, partial-bisection-divergence

    Rationale: Bisection strongly supports efe647b (4 of 5 benchmarks converged successfully, RELATED), so the culprit stands, but two findings carry alignmentWarning=True and one benchmark bisected to an unrelated commit, and no z-score/variance evidence is provided, so a maxed 5/5 change and 5/5 finding confidence are slightly overstated and should be 4/5.

    Suggested confidence: Finding Confidence → 4/5; Change Confidence → 4/5 (advisory — not applied)

    This critique is advisory in the current configuration and did not change the confidences, culprit, or proposed actions above.


    Generated by PerfTriageAgent on 2026-08-04 15:51 UTC

  2. DrewScoggins commented on Aug 4, 2026

    @DrewScoggins
    Member
  3. added a commit that references this issue on Aug 14, 2026
    e1169ff
  4. locked and limited conversation to collaborators on Sep 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions