Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve middleware performance #9200

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open

Improve middleware performance #9200

wants to merge 3 commits into from

Conversation

bdraco
Copy link
Member

@bdraco bdraco commented Sep 19, 2024

What do these changes do?

The contextmanager in cff60eb added quite a bit of overhead and was only used for fixing the current app when using middleware. I did a github code search and did not find usage of set_current_app outside of aiohttp so I think its safe to remove as its unlikely to be used outside of aiohttp.

closes #9196

Are there changes in behavior for the user?

The set_current_app function has been removed.

Is it a substantial burden for the maintainers to support this?

no

The contextmanager in cff60eb
added quite a bit of overhead and was only used for fixing
the current app when using middleware. I did a github
code search and did not find usage of set_current_app
outside of aiohttp so I think its safe to remove as
its unlikely to be used outside of aiohttp.
@bdraco bdraco added backport-3.10 Trigger automatic backporting to the 3.10 release branch by Patchback robot backport-3.11 Trigger automatic backporting to the 3.11 release branch by Patchback robot labels Sep 19, 2024
@psf-chronographer psf-chronographer bot added the bot:chronographer:provided There is a change note present in this PR label Sep 19, 2024
Copy link

codecov bot commented Sep 19, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 98.31%. Comparing base (bf022b3) to head (9804f7a).
Report is 11 commits behind head on master.

✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##           master    #9200   +/-   ##
=======================================
  Coverage   98.31%   98.31%           
=======================================
  Files         107      107           
  Lines       34483    34507   +24     
  Branches     4093     4100    +7     
=======================================
+ Hits        33901    33927   +26     
+ Misses        411      410    -1     
+ Partials      171      170    -1     
Flag Coverage Δ
CI-GHA 98.21% <100.00%> (+<0.01%) ⬆️
OS-Linux 97.87% <100.00%> (+<0.01%) ⬆️
OS-Windows 96.29% <100.00%> (+<0.01%) ⬆️
OS-macOS 97.55% <100.00%> (+0.01%) ⬆️
Py-3.10.11 97.65% <100.00%> (+<0.01%) ⬆️
Py-3.10.14 ?
Py-3.10.15 97.58% <100.00%> (+0.05%) ⬆️
Py-3.11.10 97.47% <100.00%> (?)
Py-3.11.9 97.54% <100.00%> (-0.27%) ⬇️
Py-3.12.5 ?
Py-3.12.6 97.93% <100.00%> (+0.28%) ⬆️
Py-3.9.13 97.54% <100.00%> (+0.01%) ⬆️
Py-3.9.19 ?
Py-3.9.20 97.48% <100.00%> (+<0.01%) ⬆️
Py-pypy7.3.16 97.09% <100.00%> (+<0.01%) ⬆️
VM-macos 97.55% <100.00%> (+0.01%) ⬆️
VM-ubuntu 97.87% <100.00%> (+<0.01%) ⬆️
VM-windows 96.29% <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.

@Dreamsorcerer
Copy link
Member

Is it possibly caused by the exception handling or something?
https://github.com/python/cpython/blob/4420cf4dc9ef7bd3c1c9b5465fa9397304bf0110/Lib/contextlib.py#L149

@bdraco
Copy link
Member Author

bdraco commented Sep 19, 2024

Is it possibly caused by the exception handling or something? python/cpython@4420cf4/Lib/contextlib.py#L149

Yeah it looks like the __enter__ and mostly __exit__ implementation is overkill for this use case.

@Dreamsorcerer
Copy link
Member

Is it possibly caused by the exception handling or something? python/cpython@4420cf4/Lib/contextlib.py#L149

Yeah it looks like the __enter__ and mostly __exit__ implementation is overkill for this use case.

I don't think enter is an issue. I believe try is now a 0-cost implementation in Python 3.13..

But, exit handles an exception in the expected case. I can't think of any way to make that more efficient though, other than not using the decorator...

@bdraco
Copy link
Member Author

bdraco commented Sep 19, 2024

The profile shows the most expensive part is __init__ on line 104 with cpython 3.12.4, followed by __exit__ so it looks like the context manager object has to be created every time from the helper function.

Line 108 on cpython main https://github.com/python/cpython/blob/4420cf4dc9ef7bd3c1c9b5465fa9397304bf0110/Lib/contextlib.py#L108

@bdraco
Copy link
Member Author

bdraco commented Sep 19, 2024

I recall we had a similar problem with rendering templates in Home Assistant (we can render many per second) and the solution was to create the context manager once and use it over and over... that worked because there was no await and everything finished synchronously, but we can't use that solution here.

@bdraco bdraco marked this pull request as ready for review September 19, 2024 13:16
@Dreamsorcerer
Copy link
Member

The profile shows the most expensive part is __init__ on line 104 with cpython 3.12.4, followed by __exit__ so it looks like the context manager object has to be created every time from the helper function.

Line 108 on cpython main https://github.com/python/cpython/blob/4420cf4dc9ef7bd3c1c9b5465fa9397304bf0110/Lib/contextlib.py#L108

Looks to me like there's a ContextDecorator which uses _recreate_cm() to avoid redoing the init everytime. It seems to me like the decorators could be improved a little to do that same thing instead of instantiating a new class directly on every call. Not sure how much you'd get from that, but atleast would save fetching the docs attribute etc. in the init.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backport-3.10 Trigger automatic backporting to the 3.10 release branch by Patchback robot backport-3.11 Trigger automatic backporting to the 3.11 release branch by Patchback robot bot:chronographer:provided There is a change note present in this PR
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Middleware fix up is unexpectedly expensive
2 participants