-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
Attempt to resolve the AOT warning in `DelegatingComponent`.
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | |||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -133,20 +133,33 @@ internal override ValueTask<Outcome<TResult>> ExecuteCore<TResult, TState>( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
ResilienceContext context, | |||||||||||||||||||||||||||||||||||||||||||||||||||||
TState state) | |||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | |||||||||||||||||||||||||||||||||||||||||||||||||||||
// Custom state object is used to cast the callback and state to prevent infinite | |||||||||||||||||||||||||||||||||||||||||||||||||||||
// generic type recursion warning IL3054 when referenced in a native AoT application. | |||||||||||||||||||||||||||||||||||||||||||||||||||||
// See https://github.com/App-vNext/Polly/issues/1732 for further context. | |||||||||||||||||||||||||||||||||||||||||||||||||||||
return _component.ExecuteCore( | |||||||||||||||||||||||||||||||||||||||||||||||||||||
static (context, state) => | |||||||||||||||||||||||||||||||||||||||||||||||||||||
static (context, wrapper) => | |||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | |||||||||||||||||||||||||||||||||||||||||||||||||||||
var callback = (Func<ResilienceContext, TState, ValueTask<Outcome<TResult>>>)wrapper.Callback; | |||||||||||||||||||||||||||||||||||||||||||||||||||||
var state = (TState)wrapper.State; | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
if (context.CancellationToken.IsCancellationRequested) | |||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | |||||||||||||||||||||||||||||||||||||||||||||||||||||
return Outcome.FromExceptionAsValueTask<TResult>(new OperationCanceledException(context.CancellationToken).TrySetStackTrace()); | |||||||||||||||||||||||||||||||||||||||||||||||||||||
} | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
return state.Next!.ExecuteCore(state.callback, context, state.state); | |||||||||||||||||||||||||||||||||||||||||||||||||||||
return wrapper.Next.ExecuteCore(callback, context, state); | |||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | |||||||||||||||||||||||||||||||||||||||||||||||||||||
context, | |||||||||||||||||||||||||||||||||||||||||||||||||||||
(Next, callback, state)); | |||||||||||||||||||||||||||||||||||||||||||||||||||||
new StateWrapper(Next!, callback, state!)); | |||||||||||||||||||||||||||||||||||||||||||||||||||||
} | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
public override ValueTask DisposeAsync() => default; | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
private struct StateWrapper(PipelineComponent next, object callback, object state) | |||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | |||||||||||||||||||||||||||||||||||||||||||||||||||||
public PipelineComponent Next = next; | |||||||||||||||||||||||||||||||||||||||||||||||||||||
public object Callback = callback; | |||||||||||||||||||||||||||||||||||||||||||||||||||||
public object State = state; | |||||||||||||||||||||||||||||||||||||||||||||||||||||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
martincostello
Author
Owner
|
Method | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Allocated | Alloc Ratio |
---|---|---|---|---|---|---|---|---|
Unfriendly | 64.51 ns | 0.909 ns | 1.332 ns | 1.00 | 0.00 | - | - | NA |
Friendly | 65.06 ns | 1.618 ns | 2.372 ns | 1.01 | 0.04 | 0.0025 | 24 B | NA |
This comment has been minimized.
This comment has been minimized.
Sorry, something went wrong.
martincostello
Oct 27, 2023
Author
Owner
And with a RuntimeFeature.IsDynamicCodeSupported
guard to pick old or new (there's definitely some noise in the actual numbers for the execution time):
BenchmarkDotNet v0.13.9+228a464e8be6c580ad9408e98f18813f6407fb5a, Windows 11 (10.0.22621.2428/22H2/2022Update/SunValley2)
12th Gen Intel Core i7-1270P, 1 CPU, 16 logical and 12 physical cores
.NET SDK 7.0.403
[Host] : .NET 7.0.13 (7.0.1323.51816), X64 RyuJIT AVX2
Job=MediumRun Toolchain=InProcessEmitToolchain IterationCount=15
LaunchCount=2 WarmupCount=10
Method | Mean | Error | StdDev | Ratio | RatioSD | Allocated | Alloc Ratio |
---|---|---|---|---|---|---|---|
Unfriendly | 63.35 ns | 1.702 ns | 2.547 ns | 1.00 | 0.00 | - | NA |
Friendly | 62.14 ns | 2.226 ns | 3.333 ns | 0.98 | 0.07 | - | NA |
This comment has been minimized.
This comment has been minimized.
Sorry, something went wrong.
martincostello
Oct 27, 2023
Author
Owner
Rough code from that is here.
I'm going to clean it up a bit and then open a draft PR to see how best we can move forward.
This comment has been minimized.
This comment has been minimized.
Sorry, something went wrong.
MichalStrehovsky
Oct 27, 2023
Does this introduce boxing? If yes, maybe only do this in AOT mode?
Doing things like that makes it impossible to reason about AOT perf. We don't want people to run different code on aot unless unavoidable.
If this is perf critical and the boxing cannot be tolerated, it shouldn't be tolerated on NAOT either. It's it's tolerable, don't increase your test matrix unnecessarily.
This trades the box for less jitting (evenn outside NativeAOT). That means better startup and less working set. It should be evaluated against that. Bdn unfortunately doesn't put much focus on those metrics.
This comment has been minimized.
This comment has been minimized.
Sorry, something went wrong.
Does this introduce boxing? If yes, maybe only do this in AOT mode?