#33865: Optimize django.core.handlers.wsgi.LimitedStream
-------------------------------------+-------------------------------------
Reporter: Nick Pope | Owner: Nick Pope
Type: | Status: assigned
Cleanup/optimization |
Component: HTTP | Version: dev
handling | Keywords: wsgi,
Severity: Normal | limitedstream, performance
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
The current implementation of `LimitedStream` is slow because `.read()`
performs an extra copy into a buffer and `.readline()` performs two extra
copies. We're already typically wrapping a `BytesIO` object so this is
unnecessary.
This implementation has largely been untouched for 12 years and, inspired
by a simpler implementation in `werkzeug`, I was able to achieve the
following performance improvement:
{{{
LimitedStream.read() (single line): Mean +- std dev: [bench_limitedstream-
main] 286 ns +- 6 ns -> [bench_limitedstream-patch] 227 ns +- 6 ns: 1.26x
faster
LimitedStream.readline() (single line): Mean +- std dev:
[bench_limitedstream-main] 507 ns +- 11 ns -> [bench_limitedstream-patch]
232 ns +- 8 ns: 2.18x faster
LimitedStream.read(8192) (single line): Mean +- std dev:
[bench_limitedstream-main] 360 ns +- 8 ns -> [bench_limitedstream-patch]
297 ns +- 6 ns: 1.21x faster
LimitedStream.readline(8192) (single line): Mean +- std dev:
[bench_limitedstream-main] 602 ns +- 10 ns -> [bench_limitedstream-patch]
305 ns +- 10 ns: 1.98x faster
LimitedStream.read() (multiple lines): Mean +- std dev:
[bench_limitedstream-main] 290 ns +- 5 ns -> [bench_limitedstream-patch]
236 ns +- 6 ns: 1.23x faster
LimitedStream.readline() (multiple lines): Mean +- std dev:
[bench_limitedstream-main] 517 ns +- 19 ns -> [bench_limitedstream-patch]
239 ns +- 7 ns: 2.16x faster
LimitedStream.read(8192) (multiple lines): Mean +- std dev:
[bench_limitedstream-main] 363 ns +- 8 ns -> [bench_limitedstream-patch]
311 ns +- 11 ns: 1.17x faster
LimitedStream.readline(8192) (multiple lines): Mean +- std dev:
[bench_limitedstream-main] 601 ns +- 12 ns -> [bench_limitedstream-patch]
308 ns +- 7 ns: 1.95x faster
Geometric mean: 1.59x faster
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/33865>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/010701822c007bc8-8facb69d-d28c-4963-aa2b-f0fe0b7335c0-000000%40eu-central-1.amazonses.com.