Avatar for the aio-libs user
aio-libs
aiohttp
BlogDocsChangelog

Reduce WebSocket buffer slicing overhead

#10601Merged
Comparing
websocket_buffer_slicing
(
e274527
) with
master
(
cb6e95e
)
CodSpeed Performance Gauge
+14%
Improvements
1
Regressions
0
Untouched
46
New
0
Dropped
0
Ignored
2

Benchmarks

Improved

test_read_one_hundred_websocket_text_messages[pyloop]
tests/test_benchmarks_http_websocket.py::test_read_one_hundred_websocket_text_messages[pyloop]
CodSpeed Performance Gauge
+14%
297.5 µs
259.8 µs

Passed

test_one_thousand_round_trip_websocket_binary_messages[pyloop]
tests/test_benchmarks_client_ws.py::test_one_thousand_round_trip_websocket_binary_messages[pyloop]
CodSpeed Performance Gauge
+2%
17 ms
16.6 ms
test_one_thousand_round_trip_websocket_text_messages[pyloop]
tests/test_benchmarks_client_ws.py::test_one_thousand_round_trip_websocket_text_messages[pyloop]
CodSpeed Performance Gauge
+2%
17.4 ms
17 ms
test_read_large_binary_websocket_messages[pyloop]
tests/test_benchmarks_http_websocket.py::test_read_large_binary_websocket_messages[pyloop]
CodSpeed Performance Gauge
+1%
9.1 ms
9 ms
test_resolve_single_fixed_url_with_many_routes[pyloop]
tests/test_benchmarks_web_urldispatcher.py::test_resolve_single_fixed_url_with_many_routes[pyloop]
CodSpeed Performance Gauge
+1%
896.4 µs
890.3 µs
test_resolve_dynamic_resource_url_with_many_dynamic_routes[pyloop]
tests/test_benchmarks_web_urldispatcher.py::test_resolve_dynamic_resource_url_with_many_dynamic_routes[pyloop]
CodSpeed Performance Gauge
+1%
3.6 ms
3.5 ms
test_one_hundred_json_post_requests[pyloop]
tests/test_benchmarks_client.py::test_one_hundred_json_post_requests[pyloop]
CodSpeed Performance Gauge
+1%
38.6 ms
38.4 ms
test_resolve_root_route[pyloop]
tests/test_benchmarks_web_urldispatcher.py::test_resolve_root_route[pyloop]
CodSpeed Performance Gauge
+1%
883.7 µs
879.1 µs
test_resolve_multiple_fixed_url_with_many_routes[pyloop]
tests/test_benchmarks_web_urldispatcher.py::test_resolve_multiple_fixed_url_with_many_routes[pyloop]
CodSpeed Performance Gauge
0%
2.2 ms
2.2 ms
test_create_client_request_with_headers[pyloop]
tests/test_benchmarks_client_request.py::test_create_client_request_with_headers[pyloop]
CodSpeed Performance Gauge
0%
71 µs
70.7 µs
test_send_one_hundred_websocket_text_messages[pyloop]
tests/test_benchmarks_http_websocket.py::test_send_one_hundred_websocket_text_messages[pyloop]
CodSpeed Performance Gauge
0%
563.6 µs
561.7 µs
test_one_hundred_simple_post_requests[pyloop]
tests/test_benchmarks_client.py::test_one_hundred_simple_post_requests[pyloop]
CodSpeed Performance Gauge
0%
36.7 ms
36.6 ms
test_resolve_prefix_resources_many_prefix_many_plain[pyloop]
tests/test_benchmarks_web_urldispatcher.py::test_resolve_prefix_resources_many_prefix_many_plain[pyloop]
CodSpeed Performance Gauge
0%
4.6 ms
4.6 ms
test_one_hundred_simple_get_requests_multiple_methods_route[pyloop]
tests/test_benchmarks_client.py::test_one_hundred_simple_get_requests_multiple_methods_route[pyloop]
CodSpeed Performance Gauge
0%
32 ms
31.9 ms
test_one_hundred_get_requests_with_1024_chunked_payload[pyloop]
tests/test_benchmarks_client.py::test_one_hundred_get_requests_with_1024_chunked_payload[pyloop]
CodSpeed Performance Gauge
0%
35.5 ms
35.4 ms
test_one_hundred_get_requests_with_30000_content_length_payload[pyloop]
tests/test_benchmarks_client.py::test_one_hundred_get_requests_with_30000_content_length_payload[pyloop]
CodSpeed Performance Gauge
0%
39.3 ms
39.3 ms
test_one_hundred_get_requests_with_1024_content_length_payload[pyloop]
tests/test_benchmarks_client.py::test_one_hundred_get_requests_with_1024_content_length_payload[pyloop]
CodSpeed Performance Gauge
0%
35.1 ms
35 ms
test_client_request_update_cookies[pyloop]
tests/test_benchmarks_client_request.py::test_client_request_update_cookies[pyloop]
CodSpeed Performance Gauge
0%
169.2 µs
168.9 µs
test_ten_web_middlewares[pyloop]
tests/test_benchmarks_web_middleware.py::test_ten_web_middlewares[pyloop]
CodSpeed Performance Gauge
0%
35 ms
34.9 ms
test_one_hundred_simple_get_requests[pyloop]
tests/test_benchmarks_client.py::test_one_hundred_simple_get_requests[pyloop]
CodSpeed Performance Gauge
0%
32.2 ms
32.2 ms
test_one_hundred_get_requests_with_30000_chunked_payload[pyloop]
tests/test_benchmarks_client.py::test_one_hundred_get_requests_with_30000_chunked_payload[pyloop]
CodSpeed Performance Gauge
0%
40.5 ms
40.4 ms
test_resolve_multiple_level_fixed_url_with_many_routes[pyloop]
tests/test_benchmarks_web_urldispatcher.py::test_resolve_multiple_level_fixed_url_with_many_routes[pyloop]
CodSpeed Performance Gauge
0%
8.5 ms
8.5 ms
test_one_thousand_large_round_trip_websocket_text_messages[pyloop]
tests/test_benchmarks_client_ws.py::test_one_thousand_large_round_trip_websocket_text_messages[pyloop]
CodSpeed Performance Gauge
0%
24.3 ms
24.2 ms
test_resolve_gitapi[pyloop]
tests/test_benchmarks_web_urldispatcher.py::test_resolve_gitapi[pyloop]
CodSpeed Performance Gauge
0%
294.4 ms
294.3 ms
test_load_cookies_into_temp_cookiejar
tests/test_benchmarks_cookiejar.py::test_load_cookies_into_temp_cookiejar
CodSpeed Performance Gauge
0%
198.8 µs
198.7 µs
test_serialize_headers
tests/test_benchmarks_http_writer.py::test_serialize_headers
CodSpeed Performance Gauge
0%
1 ms
1 ms
test_simple_web_stream_response
tests/test_benchmarks_web_response.py::test_simple_web_stream_response
CodSpeed Performance Gauge
0%
233.7 µs
233.7 µs
test_get_request_with_251308_compressed_chunked_payload[pyloop]
tests/test_benchmarks_client.py::test_get_request_with_251308_compressed_chunked_payload[pyloop]
CodSpeed Performance Gauge
0%
426 ms
426 ms
test_one_hundred_get_requests_with_512kib_content_length_payload[pyloop]
tests/test_benchmarks_client.py::test_one_hundred_get_requests_with_512kib_content_length_payload[pyloop]
CodSpeed Performance Gauge
0%
164.6 ms
164.6 ms
test_resolve_dynamic_resource_url_with_many_dynamic_routes_with_common_prefix[pyloop]
tests/test_benchmarks_web_urldispatcher.py::test_resolve_dynamic_resource_url_with_many_dynamic_routes_with_common_prefix[pyloop]
CodSpeed Performance Gauge
0%
248.5 ms
248.6 ms
test_simple_web_file_sendfile_fallback_response[pyloop]
tests/test_benchmarks_web_fileresponse.py::test_simple_web_file_sendfile_fallback_response[pyloop]
CodSpeed Performance Gauge
0%
84.3 ms
84.4 ms
test_send_one_hundred_websocket_text_messages_with_mask[pyloop]
tests/test_benchmarks_http_websocket.py::test_send_one_hundred_websocket_text_messages_with_mask[pyloop]
CodSpeed Performance Gauge
0%
795.2 µs
795.7 µs
test_resolve_dynamic_resource_url_with_many_static_routes[pyloop]
tests/test_benchmarks_web_urldispatcher.py::test_resolve_dynamic_resource_url_with_many_static_routes[pyloop]
CodSpeed Performance Gauge
0%
3.6 ms
3.6 ms
test_simple_web_file_response_not_modified[pyloop]
tests/test_benchmarks_web_fileresponse.py::test_simple_web_file_response_not_modified[pyloop]
CodSpeed Performance Gauge
0%
55.2 ms
55.2 ms
test_send_one_hundred_websocket_compressed_messages[pyloop]
tests/test_benchmarks_http_websocket.py::test_send_one_hundred_websocket_compressed_messages[pyloop]
CodSpeed Performance Gauge
0%
3 ms
3 ms
test_resolve_gitapi_subapps[pyloop]
tests/test_benchmarks_web_urldispatcher.py::test_resolve_gitapi_subapps[pyloop]
CodSpeed Performance Gauge
0%
296.8 ms
297.1 ms
test_resolve_static_root_route[pyloop]
tests/test_benchmarks_web_urldispatcher.py::test_resolve_static_root_route[pyloop]
CodSpeed Performance Gauge
0%
979.4 µs
980.5 µs
test_create_client_request_with_cookies[pyloop]
tests/test_benchmarks_client_request.py::test_create_client_request_with_cookies[pyloop]
CodSpeed Performance Gauge
0%
127.3 µs
127.5 µs
test_simple_web_file_response[pyloop]
tests/test_benchmarks_web_fileresponse.py::test_simple_web_file_response[pyloop]
CodSpeed Performance Gauge
0%
78.3 ms
78.4 ms
test_resolve_gitapi_root[pyloop]
tests/test_benchmarks_web_urldispatcher.py::test_resolve_gitapi_root[pyloop]
CodSpeed Performance Gauge
0%
2 ms
2 ms
test_send_client_request_one_hundred[pyloop]
tests/test_benchmarks_client_request.py::test_send_client_request_one_hundred[pyloop]
CodSpeed Performance Gauge
0%
2.4 ms
2.4 ms
test_send_one_hundred_large_websocket_text_messages[pyloop]
tests/test_benchmarks_http_websocket.py::test_send_one_hundred_large_websocket_text_messages[pyloop]
CodSpeed Performance Gauge
0%
533.8 µs
535.7 µs
test_resolve_root_route_with_many_fixed_routes[pyloop]
tests/test_benchmarks_web_urldispatcher.py::test_resolve_root_route_with_many_fixed_routes[pyloop]
CodSpeed Performance Gauge
0%
879 µs
883.4 µs
test_web_response_with_text_body
tests/test_benchmarks_web_response.py::test_web_response_with_text_body
CodSpeed Performance Gauge
-1%
647.1 µs
651.3 µs
test_simple_web_response
tests/test_benchmarks_web_response.py::test_simple_web_response
CodSpeed Performance Gauge
-1%
436.9 µs
440 µs
test_web_response_with_bytes_body
tests/test_benchmarks_web_response.py::test_web_response_with_bytes_body
CodSpeed Performance Gauge
-1%
532.3 µs
536.3 µs
test_web_response_with_headers
tests/test_benchmarks_web_response.py::test_web_response_with_headers
CodSpeed Performance Gauge
-1%
868.7 µs
877.6 µs

Ignored

test_one_hundred_get_requests_iter_chunks_on_512kib_chunked_payload[pyloop]Ignored
tests/test_benchmarks_client.py::test_one_hundred_get_requests_iter_chunks_on_512kib_chunked_payload[pyloop]
CodSpeed Performance Gauge
0%
119.4 ms
119.5 ms
test_one_hundred_get_requests_with_512kib_chunked_payload[pyloop]Ignored
tests/test_benchmarks_client.py::test_one_hundred_get_requests_with_512kib_chunked_payload[pyloop]
CodSpeed Performance Gauge
0%
188.5 ms
188.6 ms

Commits

Click on a commit to change the comparison range
Base
master
cb6e95e
+17%
Reduce WebSocket buffer slicing overhead Use a `const unsigned char *` for the buffer as its a lot faster than copying around PyBytes objects. We do need to be careful that all slices are bounded and we boundchecks everything to make sure we do not do an out of bounds read. I checked that all accesses to buf_cstr are preceeded by a boundchecks but it would be good to get another set of eyes on that to verify in the `self._state == READ_PAYLOAD` that we will never try to read out of bounds.
218ec01
25 days ago
by bdraco
0%
changelog
498175a
25 days ago
by bdraco
-3%
Update aiohttp/_websocket/reader_py.py Co-authored-by: Sam Bull <git@sambull.org>
e274527
19 days ago
by bdraco
© 2025 CodSpeed Technology
Home Terms PrivacyDocs