From 250f786c385fae932c6d819f2c1555febfdc8c73 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 23 Nov 2023 17:34:11 +0100 Subject: [PATCH] Add benchmarks for calling back bluetooth packets (#671) --- aioesphomeapi/client.py | 6 +-- bench/raw_ble_plain_text_with_callback.py | 56 +++++++++++++++++++++++ 2 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 bench/raw_ble_plain_text_with_callback.py diff --git a/aioesphomeapi/client.py b/aioesphomeapi/client.py index c4a9a01..f81f4a3 100644 --- a/aioesphomeapi/client.py +++ b/aioesphomeapi/client.py @@ -573,14 +573,13 @@ class APIClient: async def subscribe_bluetooth_le_advertisements( self, on_bluetooth_le_advertisement: Callable[[BluetoothLEAdvertisement], None] ) -> Callable[[], None]: - msg_types = (BluetoothLEAdvertisementResponse,) unsub_callback = self._get_connection().send_message_callback_response( SubscribeBluetoothLEAdvertisementsRequest(flags=0), partial( self._on_bluetooth_le_advertising_response, on_bluetooth_le_advertisement, ), - msg_types, + (BluetoothLEAdvertisementResponse,), ) def unsub() -> None: @@ -602,13 +601,12 @@ class APIClient: async def subscribe_bluetooth_le_raw_advertisements( self, on_advertisements: Callable[[list[BluetoothLERawAdvertisement]], None] ) -> Callable[[], None]: - msg_types = (BluetoothLERawAdvertisementsResponse,) unsub_callback = self._get_connection().send_message_callback_response( SubscribeBluetoothLEAdvertisementsRequest( flags=BluetoothProxySubscriptionFlag.RAW_ADVERTISEMENTS ), partial(self._on_ble_raw_advertisement_response, on_advertisements), - msg_types, + (BluetoothLERawAdvertisementsResponse,), ) def unsub() -> None: diff --git a/bench/raw_ble_plain_text_with_callback.py b/bench/raw_ble_plain_text_with_callback.py new file mode 100644 index 0000000..ab548ed --- /dev/null +++ b/bench/raw_ble_plain_text_with_callback.py @@ -0,0 +1,56 @@ +import timeit +from functools import partial + +from aioesphomeapi import APIConnection +from aioesphomeapi.api_pb2 import ( + BluetoothLERawAdvertisement, + BluetoothLERawAdvertisementsResponse, +) +from aioesphomeapi.client import APIClient + +# cythonize -X language_level=3 -a -i aioesphomeapi/connection.py + + +class MockConnection(APIConnection): + pass + + +client = APIClient("fake.address", 6052, None) +connection = MockConnection(client._params, lambda expected_disconnect: None, None) + + +def process_incoming_msg(): + connection.process_packet( + 93, + b'\n\xb2\x01\x08\x01\x10\xab\x01\x18\x02"\xa8\x016c04010134000000' + b"e25389019500000001016f00250000002f6f72672f626c75657a2f686369302" + b"f64656c04010134000000e25389019500000001016f00250000002f6f72672f" + b"626c75657a2f686369302f6465\n\xb2\x01\x08\x01\x10\xab\x01\x18\x02" + b'"\xa8\x016c04010134000000e25389019500000001016f00250000002f6f726' + b"72f626c75657a2f686369302f64656c04010134000000e253890195000000010" + b"16f00250000002f6f72672f626c75657a2f686369302f6465\n\xb2\x01\x08" + b'\x01\x10\xab\x01\x18\x02"\xa8\x016c04010134000000e25389019500000' + b"001016f00250000002f6f72672f626c75657a2f686369302f64656c040101340" + b"00000e25389019500000001016f00250000002f6f72672f626c75657a2f68636" + b'9302f6465\n\xb2\x01\x08\x01\x10\xab\x01\x18\x02"\xa8\x016c040101' + b"34000000e25389019500000001016f00250000002f6f72672f626c75657a2f68" + b"6369302f64656c04010134000000e25389019500000001016f00250000002f6f" + b"72672f626c75657a2f686369302f6465\n\xb2\x01\x08\x01\x10\xab\x01" + b'\x18\x02"\xa8\x016c04010134000000e25389019500000001016f002500000' + b"02f6f72672f626c75657a2f686369302f64656c04010134000000e2538901950" + b"0000001016f00250000002f6f72672f626c75657a2f686369302f6465", + ) + + +def on_advertisements(msgs: list[BluetoothLERawAdvertisement]): + pass + + +connection.add_message_callback( + partial(client._on_ble_raw_advertisement_response, on_advertisements), + (BluetoothLERawAdvertisementsResponse,), +) + +count = 3000000 +time = timeit.Timer(process_incoming_msg).timeit(count) +print(f"Processed {count} bluetooth messages took {time} seconds")