Skip to content

Conversation

@martincostello
Copy link
Member

  • Avoid LINQ to create components.
  • Do not recreate Outcome<T> for chaos.
  • Avoid predicate allocation.
  • Use ArgumentNullException.ThrowIfNull() where possible.
  • Add throw helper for ObjectDisposedException.
  • Remove unused Stopwatch.
  • Use Volatile.Read instead of Interlocked.CompareExchange().

Cherry-picked from #2664.

- Avoid LINQ to create components.
- Do not recreate `Outcome<T>` for chaos.
- Avoid predicate allocation.
- Use `ArgumentNullException.ThrowIfNull()` where possible.
- Add throw helper for `ObjectDisposedException`.
- Remove unused `Stopwatch`.
- Use `Volatile.Read` instead of `Interlocked.CompareExchange()`.

Cherry-picked from #2664.

Co-Authored-By: Pent Ploompuu <[email protected]>
@codecov
Copy link

codecov bot commented Jul 8, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 96.23%. Comparing base (0459a8b) to head (c278bb8).
Report is 7 commits behind head on main.

✅ All tests successful. No failed tests found.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2667      +/-   ##
==========================================
- Coverage   96.23%   96.23%   -0.01%     
==========================================
  Files         311      311              
  Lines        7329     7322       -7     
  Branches     1013     1012       -1     
==========================================
- Hits         7053     7046       -7     
  Misses        222      222              
  Partials       54       54              
Flag Coverage Δ
linux 96.23% <100.00%> (-0.01%) ⬇️
macos 96.23% <100.00%> (-0.01%) ⬇️
windows 96.22% <100.00%> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Update the benchmarks for latest run.
@martincostello
Copy link
Member Author

Ran benchmarks on main and then compared to the results pushed into this PR.

Almost all benchmarks had improvements, though not necessarily large. Some benchmarks that didn't show an improvement were within the margin of error for measurement noise.

@martincostello martincostello marked this pull request as ready for review July 8, 2025 14:24
@Copilot Copilot AI review requested due to automatic review settings July 8, 2025 14:24
@martincostello martincostello added this to the 8.6.2 milestone Jul 8, 2025
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

This PR applies a series of low-level performance optimizations across the pipeline utilities, reducing allocations and improving synchronization checks.

  • Swaps Interlocked.CompareExchange for Volatile.Read to check pending executions.
  • Introduces a throw helper for ObjectDisposedException and uses ArgumentNullException.ThrowIfNull() when available.
  • Replaces LINQ allocation patterns and streamlines default predicate instantiation.

Reviewed Changes

Copilot reviewed 23 out of 23 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
ExecutionTrackingComponent.cs Uses Volatile.Read instead of Interlocked.CompareExchange
ComponentDisposeHelper.cs Extracts throw logic into a dedicated helper method
Guard.cs Calls ArgumentNullException.ThrowIfNull() under .NET 8+
DefaultPredicates.cs Replaces switch-expression allocation with direct ValueTask
ResiliencePipelineBuilderBase.cs Uses List<T>.ConvertAll instead of LINQ Select().ToList()
Comments suppressed due to low confidence (1)

src/Polly.Core/Utils/Guard.cs:12

  • Add or update unit tests to cover the ArgumentNullException.ThrowIfNull path under .NET 8+ to ensure the guard behaves as expected.
#if NET8_0_OR_GREATER

@martincostello martincostello enabled auto-merge (rebase) July 8, 2025 14:25
@martincostello martincostello merged commit a75929c into main Jul 8, 2025
26 checks passed
@martincostello martincostello deleted the perf-tweaks branch July 8, 2025 14:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant