ベンチマーク結果

すべてのベンチマークは、E2E暗号化(AES-128-GCM)を有効にしたbleRPCファームウェアを実行するnRF54L15 DKペリフェラルに対して実施されました。MTUは247バイトで合意形成されています。いずれのCentralもコネクションインターバルは15msで合意形成されました。

スループット比較

Python (macOS)

56.6
KB/s flash read

CI: 15ms

iOS (iPhone 16)

55.5
KB/s flash read

CI: 15ms

Android (Pixel 5)

83.5
KB/s flash read

CI: 15ms

Web (Chrome, macOS)

57.4
KB/s flash read

CI: 15ms

プラットフォーム別詳細結果

Python Central (macOS, bleak)

コネクションインターバル: 15ms(macOSによる合意形成) — テストコード

ベンチマーク結果詳細
flash_read_throughput56.6 KB/s10x 8192バイト、141.3 ms/call
flash_read_overhead30.1 ms/call1バイト x 20回
echo_roundtrip30.0 ms/call50回
data_write_throughput6.5 KB/s200バイト x 20回、30.1 ms/call
counter_stream (P→C)3.3 ms/item20アイテム、66 ms
counter_upload (C→P)2.9 ms/item20アイテム、59 ms
機能テスト結果詳細
echo_basicPASS
echo_emptyPASS
echo_max_lengthPASS256文字
flash_read_basicPASS16バイト
flash_read_8kbPASS8192バイト
data_write_basicPASS1024バイト
data_write_8kbPASS8192バイト
multi_container_echoPASS250文字
counter_streamPASS5アイテム
counter_stream_largePASS20アイテム
counter_uploadPASS5アイテム
counter_upload_largePASS20アイテム

iOS Central (iPhone 16, CoreBluetooth)

コネクションインターバル: 15ms(iOSによる合意形成) — テストコード

ベンチマーク結果詳細
flash_read_throughput55.5 KB/s10x 8192バイト、144.1 ms/call
flash_read_overhead30.0 ms/call1バイト x 20回
echo_roundtrip30.6 ms/call50回
data_write_throughput6.4 KB/s200バイト x 20回、30.6 ms/call
counter_stream (P→C)3.1 ms/item20アイテム、62 ms
counter_upload (C→P)3.8 ms/item20アイテム、75 ms
機能テスト結果詳細
echo_basicPASS
echo_emptyPASS
flash_read_basicPASS64バイト
flash_read_8kbPASS8192バイト
data_writePASS64バイト
counter_streamPASS5アイテム
counter_uploadPASS5アイテム

Android Central (Pixel 5)

コネクションインターバル: 15ms(Androidによる合意形成) — テストコード

ベンチマーク結果詳細
flash_read_throughput83.5 KB/s10x 8192バイト、95.8 ms/call
flash_read_overhead38.4 ms/call1バイト x 20回
echo_roundtrip38.2 ms/call50回
data_write_throughput4.8 KB/s200バイト x 20回、40.7 ms/call
counter_stream (P→C)2.8 ms/item20アイテム、55 ms
counter_upload (C→P)5.9 ms/item20アイテム、118 ms
機能テスト結果詳細
echo_basicPASS
echo_emptyPASS
flash_read_basicPASS64バイト
flash_read_8kbPASS8192バイト
data_writePASS64バイト
counter_streamPASS5アイテム
counter_uploadPASS5アイテム

Web Central (Chrome, macOS, Web Bluetooth)

コネクションインターバル: 15ms(macOSによる合意形成) — テストコード

ベンチマーク結果詳細
flash_read_throughput57.4 KB/s10x 8192バイト、139.3 ms/call
flash_read_overhead30.0 ms/call1バイト x 20回
echo_roundtrip30.0 ms/call50回
data_write_throughput6.5 KB/s200バイト x 20回、30.0 ms/call
counter_stream (P→C)3.1 ms/item20アイテム、61 ms
counter_upload (C→P)2.8 ms/item20アイテム、56 ms

central_web デモ(Chrome、暗号化、MTU 247)で計測。トランスポート非依存のプロトコル層(@blerpc/protocol-ts)がブラウザでもそのまま動作するため、Python(macOS)セントラルとほぼ同等の結果になります。

パフォーマンスに関する注記

コネクションインターバルの影響

コネクションインターバル(CI)は、ラウンドトリップレイテンシの主要な要因です。1回のリクエスト・レスポンスサイクルには2コネクションイベント(Centralによるリクエスト書き込みと、ペリフェラルからの通知)を要します。ファームウェアは推奨インターバルを15msに固定しており(PREF_MIN_INT = PREF_MAX_INT = 12)、検証したすべてのCentralがこれを受け入れます:

コストがかかるのは範囲で要求した場合です。以前の15〜30msの範囲(PREF_MAX_INT=24)では、どのCentralも省電力側の端である30msを選び、ラウンドトリップは約60msと倍になっていました。この30msはOS側の下限ではなく、ペリフェラル自身の要求が原因でした。問題にならなかった点が2つあります。AndroidでrequestConnectionPriority(CONNECTION_PRIORITY_HIGH)を呼ぶ必要はありません(アプリの接続優先度設定に関わらず、ペリフェラル側のパラメータ更新要求が受け入れられます)。またiPhoneでは、AppleのQA1931が警告する「15msの要求を30msにスケールし直す」挙動は発生しませんでした。トレードオフは消費電力です。

再現する場合の注意: ペリフェラルがパラメータ更新を要求するのは接続からCONFIG_BT_CONN_PARAM_UPDATE_TIMEOUT(5秒)後で、それまでのCIはCentral側の初期値(macOS・iOSは30ms、Pixel 5は45ms)です。上記のベンチマークはいずれも接続後5.5秒待ってから計測しており、Centralの初期値ではなく合意形成後のCIを測っています。

暗号化のオーバーヘッド

E2E暗号化はトランザクションあたり20バイトのオーバーヘッドを追加します(4バイトのカウンター + 16バイトのAES-GCMタグ)。大きなペイロード(8 KB)の場合、このオーバーヘッドは無視できる程度です(0.3%未満)。AES-128-GCMの暗号化/復号自体は、最新のモバイルデバイスではハードウェアアクセラレーションされ、8 KBのペイロードでも1ms未満で完了

スループット最適化