Benchmark Results

All benchmarks were performed against a nRF54L15 DK peripheral running bleRPC firmware with E2E encryption enabled (AES-128-GCM). MTU was negotiated to 247 bytes. Connection interval varies by platform.

Throughput Comparison

Python (macOS)

30.3
KB/s flash read

CI: 15ms

iOS (iPhone 16)

32.1
KB/s flash read

CI: 30ms

Android (Pixel 5)

59.0
KB/s flash read

CI: 30ms

Detailed Results by Platform

Python Central (macOS, bleak)

Connection interval: 15ms (macOS negotiation) — test code

BenchmarkResultDetails
flash_read_throughput30.3 KB/s10x 8192 bytes, 264.2 ms/call
flash_read_overhead60.1 ms/call1 byte x 20 calls
echo_roundtrip60.6 ms/call50 calls
data_write_throughput3.3 KB/s200 bytes x 20 calls, 59.9 ms/call
counter_stream (P→C)5.8 ms/item20 items in 117 ms
counter_upload (C→P)7.4 ms/item20 items in 147 ms
Functional TestResultDetails
echo_basicPASS
echo_emptyPASS
echo_max_lengthPASS256-char string
flash_read_basicPASS16 bytes
flash_read_8kbPASS8192 bytes
data_write_basicPASS1024 bytes
data_write_8kbPASS8192 bytes
multi_container_echoPASS250-char string
counter_streamPASS5 items
counter_stream_largePASS20 items
counter_uploadPASS5 items
counter_upload_largePASS20 items

iOS Central (iPhone 16, CoreBluetooth)

Connection interval: 30ms (iOS negotiation) — test code

BenchmarkResultDetails
flash_read_throughput32.1 KB/s10x 8192 bytes, 249.0 ms/call
flash_read_overhead62.3 ms/call1 byte x 20 calls
echo_roundtrip60.0 ms/call50 calls
data_write_throughput3.3 KB/s200 bytes x 20 calls, 60.0 ms/call
counter_stream (P→C)6.1 ms/item20 items in 121 ms
counter_upload (C→P)4.5 ms/item20 items in 91 ms
Functional TestResultDetails
echo_basicPASS
echo_emptyPASS
flash_read_basicPASS64 bytes
flash_read_8kbPASS8192 bytes
data_writePASS64 bytes
counter_streamPASS5 items
counter_uploadPASS5 items

Android Central (Pixel 5)

Connection interval: 30ms (Android negotiation) — test code

BenchmarkResultDetails
flash_read_throughput59.0 KB/s10x 8192 bytes, 135.7 ms/call
flash_read_overhead90.4 ms/call1 byte x 20 calls
echo_roundtrip62.2 ms/call50 calls
data_write_throughput3.2 KB/s200 bytes x 20 calls, 60.3 ms/call
counter_stream (P→C)3.7 ms/item20 items in 73 ms
counter_upload (C→P)5.1 ms/item20 items in 101 ms
Functional TestResultDetails
echo_basicPASS
echo_emptyPASS
flash_read_basicPASS64 bytes
flash_read_8kbPASS8192 bytes
data_writePASS64 bytes
counter_streamPASS5 items
counter_uploadPASS5 items

Performance Notes

Connection Interval Impact

The connection interval (CI) is the primary factor in round-trip latency. Each request–response cycle requires at least 2 connection events:

The peripheral advertises preferred CI of 15–30ms (PREF_MIN_INT=12, PREF_MAX_INT=24). The actual CI is determined by the Central’s OS.

Encryption Overhead

E2E encryption adds 20 bytes per transaction (4-byte counter + 16-byte AES-GCM tag). For large payloads (8 KB), this overhead is negligible (<0.3%). The AES-128-GCM encryption/decryption itself is hardware-accelerated on modern mobile devices and takes <1ms even for 8 KB payloads.

Throughput Optimizations