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)
CI: 15ms
iOS (iPhone 16)
CI: 30ms
Android (Pixel 5)
CI: 30ms
Detailed Results by Platform
Python Central (macOS, bleak)
Connection interval: 15ms (macOS negotiation) — test code
| Benchmark | Result | Details |
|---|---|---|
| flash_read_throughput | 30.3 KB/s | 10x 8192 bytes, 264.2 ms/call |
| flash_read_overhead | 60.1 ms/call | 1 byte x 20 calls |
| echo_roundtrip | 60.6 ms/call | 50 calls |
| data_write_throughput | 3.3 KB/s | 200 bytes x 20 calls, 59.9 ms/call |
| counter_stream (P→C) | 5.8 ms/item | 20 items in 117 ms |
| counter_upload (C→P) | 7.4 ms/item | 20 items in 147 ms |
| Functional Test | Result | Details |
|---|---|---|
| echo_basic | PASS | |
| echo_empty | PASS | |
| echo_max_length | PASS | 256-char string |
| flash_read_basic | PASS | 16 bytes |
| flash_read_8kb | PASS | 8192 bytes |
| data_write_basic | PASS | 1024 bytes |
| data_write_8kb | PASS | 8192 bytes |
| multi_container_echo | PASS | 250-char string |
| counter_stream | PASS | 5 items |
| counter_stream_large | PASS | 20 items |
| counter_upload | PASS | 5 items |
| counter_upload_large | PASS | 20 items |
iOS Central (iPhone 16, CoreBluetooth)
Connection interval: 30ms (iOS negotiation) — test code
| Benchmark | Result | Details |
|---|---|---|
| flash_read_throughput | 32.1 KB/s | 10x 8192 bytes, 249.0 ms/call |
| flash_read_overhead | 62.3 ms/call | 1 byte x 20 calls |
| echo_roundtrip | 60.0 ms/call | 50 calls |
| data_write_throughput | 3.3 KB/s | 200 bytes x 20 calls, 60.0 ms/call |
| counter_stream (P→C) | 6.1 ms/item | 20 items in 121 ms |
| counter_upload (C→P) | 4.5 ms/item | 20 items in 91 ms |
| Functional Test | Result | Details |
|---|---|---|
| echo_basic | PASS | |
| echo_empty | PASS | |
| flash_read_basic | PASS | 64 bytes |
| flash_read_8kb | PASS | 8192 bytes |
| data_write | PASS | 64 bytes |
| counter_stream | PASS | 5 items |
| counter_upload | PASS | 5 items |
Android Central (Pixel 5)
Connection interval: 30ms (Android negotiation) — test code
| Benchmark | Result | Details |
|---|---|---|
| flash_read_throughput | 59.0 KB/s | 10x 8192 bytes, 135.7 ms/call |
| flash_read_overhead | 90.4 ms/call | 1 byte x 20 calls |
| echo_roundtrip | 62.2 ms/call | 50 calls |
| data_write_throughput | 3.2 KB/s | 200 bytes x 20 calls, 60.3 ms/call |
| counter_stream (P→C) | 3.7 ms/item | 20 items in 73 ms |
| counter_upload (C→P) | 5.1 ms/item | 20 items in 101 ms |
| Functional Test | Result | Details |
|---|---|---|
| echo_basic | PASS | |
| echo_empty | PASS | |
| flash_read_basic | PASS | 64 bytes |
| flash_read_8kb | PASS | 8192 bytes |
| data_write | PASS | 64 bytes |
| counter_stream | PASS | 5 items |
| counter_upload | PASS | 5 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:
- macOS (bleak): CI = 15ms → ~30ms round-trip
- iOS (iPhone 16): CI = 30ms → ~60ms round-trip
- Android (Pixel 5): CI = 30ms → ~60ms round-trip, but highest throughput due to more packets per connection event
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
- nanopb FT_CALLBACK: Streams flash data directly into protobuf encoding, saving 4KB static RAM
- Zero-copy response: Protobuf response is encoded directly at the container header offset
- No inter-packet delay: Containers are sent back-to-back
- Max 8KB per flash read: Optimal balance between latency and throughput