Reduce allocations in GrpcMessageExtensionUtilities.ConvertFromHttpMessageToExpando #11054
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Optimizations in
GrpcMessageExtensionUtilities.ConvertFromHttpMessageToExpando
method, which is a hotpath method and gets executed on every invocation in HTTP non-proxy use case.dynamic
type to build the HTTP response object, eliminating late binding and runtime dispatch.Improvements captured from benchmarking pipeline (Requests/sec - max) - 4 core machines.
Requests/sec (max)
With this change, app handles burst traffic better. Other core metrics, such as average RPS and memory usage, have remained stable or improved slightly.
I also collected perf profiles with a local load test run which sends stable traffic (1,000 requests)
Before
After
Delta
GrpcMessageExtensionUtilities.ConvertFromHttpMessageToExpando
– Total allocations dropped by 70,775 (82.45%)GrpcMessageExtensionUtilities.ConvertFromHttpMessageToExpando
– Total allocated size dropped by 3.54 MB (82.92%)#11040 added test coverage for this code path.
Pull request checklist
IMPORTANT: Currently, changes must be backported to the
in-proc
branch to be included in Core Tools and non-Flex deployments.in-proc
branch is not requiredrelease_notes.md