Skip to content

[perf-improver] perf: add Linux parallel job to nightly perf-timing workflow #9399

Description

@Evangelink

Goal and Rationale

PR #9311 (merged 2026-06-22) enabled cross-platform PlainProcess timing in MSTest.Performance.Runner. The nightly perf-timing-nightly.yml workflow still only had a Windows job — the comment at the top of the file even noted "once that lands, this job can move to Linux for better reproducibility." This PR adds the parallel Linux job.

Linux timing is valuable because:

  • GitHub-hosted Linux runners have more consistent CPU scheduling than Windows, giving lower-variance measurements
  • Cross-platform data reveals OS-specific performance regressions
  • Linux is the primary CI platform for most contributors

Approach

  1. Rename the existing collect job to collect-windows and its artifact to perf-timing-result-json-windows (makes the platform explicit; consistent with the new naming).
  2. Add a parallel collect-linux job on ubuntu-latest:
    • Builds with ./build.sh -pack -c Release
    • Uses a touch-based reference file (perf-run-start.ref) immediately before the runner invocation, then find -newer to locate only the fresh Result.json files — the same logic as the Windows LastWriteTimeUtc filter, expressed in idiomatic bash
    • Uploads results as perf-timing-result-json-linux (90-day retention, same as Windows)
  3. Update the workflow header comment to reflect the current state (both platforms now active).

Files Changed

File Change
.github/workflows/perf-timing-nightly.yml Rename Windows job; add Linux job; update comments

Performance Evidence

This is an infrastructure change — it adds measurement capability rather than changing measured code. No before/after numbers apply. The benefit is that maintainers will now receive nightly perf-timing-result-json-linux artifacts alongside the existing Windows artifacts.

Trade-offs

  • Adds one ubuntu-latest runner per nightly run (both jobs run in parallel, so wall-clock latency is unchanged)
  • No production code is modified; risk is limited to CI configuration

Test Status

  • YAML validated (PyYAML parse: ✅ both jobs parse correctly with correct runs-on fields)
  • No production source changes — CI will confirm on first nightly run

Warning

Protected Files — Push Permission Denied

This was originally intended as a pull request, but the patch modifies protected files. A human must create the pull request manually.

Protected files

The push was rejected because GitHub Actions does not have workflows permission to push these changes, and is never allowed to make such changes, or other authorization being used does not have this permission.

Create the pull request manually
# Download the patch from the workflow run
gh run download 28105007003 -n agent -D /tmp/agent-28105007003

# Create a new branch
git checkout -b perf-assist/add-linux-perf-timing-job-1b26175fe8ecd783 main

# Apply the patch (--3way handles cross-repo patches)
git am --3way /tmp/agent-28105007003/aw-perf-assist-add-linux-perf-timing-job.patch

# Push the branch and create the pull request
git push origin perf-assist/add-linux-perf-timing-job-1b26175fe8ecd783
gh pr create --title '[perf-improver] perf: add Linux parallel job to nightly perf-timing workflow' --base main --head perf-assist/add-linux-perf-timing-job-1b26175fe8ecd783 --repo microsoft/testfx

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Perf Improver workflow. · 1.1K AIC · ⌖ 59.1 AIC · ⊞ 57.6K · [◷]( · )

Add this agentic workflows to your repo

To install this agentic workflow, run

gh aw add githubnext/agentics/workflows/perf-improver.md@main

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions