ベンチマーク結果
すべてのベンチマークは、E2E暗号化(AES-128-GCM)を有効にしたbleRPCファームウェアを実行するnRF54L15 DKペリフェラルに対して実施されました。MTUは247バイトにネゴシエーションされています。コネクションインターバルはプラットフォームにより異なります。
スループット比較
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
プラットフォーム別詳細結果
Python Central (macOS, bleak)
コネクションインターバル: 15ms(macOSネゴシエーション) — テストコード
| ベンチマーク | 結果 | 詳細 |
|---|---|---|
| flash_read_throughput | 30.3 KB/s | 10x 8192バイト、264.2 ms/回 |
| flash_read_overhead | 60.1 ms/回 | 1バイト x 20回 |
| echo_roundtrip | 60.6 ms/回 | 50回 |
| data_write_throughput | 3.3 KB/s | 200バイト x 20回、59.9 ms/回 |
| counter_stream (P→C) | 5.8 ms/アイテム | 20アイテム、117 ms |
| counter_upload (C→P) | 7.4 ms/アイテム | 20アイテム、147 ms |
| 機能テスト | 結果 | 詳細 |
|---|---|---|
| echo_basic | PASS | |
| echo_empty | PASS | |
| echo_max_length | PASS | 256文字 |
| flash_read_basic | PASS | 16バイト |
| flash_read_8kb | PASS | 8192バイト |
| data_write_basic | PASS | 1024バイト |
| data_write_8kb | PASS | 8192バイト |
| multi_container_echo | PASS | 250文字 |
| counter_stream | PASS | 5アイテム |
| counter_stream_large | PASS | 20アイテム |
| counter_upload | PASS | 5アイテム |
| counter_upload_large | PASS | 20アイテム |
iOS Central (iPhone 16, CoreBluetooth)
コネクションインターバル: 30ms(iOSネゴシエーション) — テストコード
| ベンチマーク | 結果 | 詳細 |
|---|---|---|
| flash_read_throughput | 32.1 KB/s | 10x 8192バイト、249.0 ms/回 |
| flash_read_overhead | 62.3 ms/回 | 1バイト x 20回 |
| echo_roundtrip | 60.0 ms/回 | 50回 |
| data_write_throughput | 3.3 KB/s | 200バイト x 20回、60.0 ms/回 |
| counter_stream (P→C) | 6.1 ms/アイテム | 20アイテム、121 ms |
| counter_upload (C→P) | 4.5 ms/アイテム | 20アイテム、91 ms |
| 機能テスト | 結果 | 詳細 |
|---|---|---|
| echo_basic | PASS | |
| echo_empty | PASS | |
| flash_read_basic | PASS | 64バイト |
| flash_read_8kb | PASS | 8192バイト |
| data_write | PASS | 64バイト |
| counter_stream | PASS | 5アイテム |
| counter_upload | PASS | 5アイテム |
Android Central (Pixel 5)
コネクションインターバル: 30ms(Androidネゴシエーション) — テストコード
| ベンチマーク | 結果 | 詳細 |
|---|---|---|
| flash_read_throughput | 59.0 KB/s | 10x 8192バイト、135.7 ms/回 |
| flash_read_overhead | 90.4 ms/回 | 1バイト x 20回 |
| echo_roundtrip | 62.2 ms/回 | 50回 |
| data_write_throughput | 3.2 KB/s | 200バイト x 20回、60.3 ms/回 |
| counter_stream (P→C) | 3.7 ms/アイテム | 20アイテム、73 ms |
| counter_upload (C→P) | 5.1 ms/アイテム | 20アイテム、101 ms |
| 機能テスト | 結果 | 詳細 |
|---|---|---|
| echo_basic | PASS | |
| echo_empty | PASS | |
| flash_read_basic | PASS | 64バイト |
| flash_read_8kb | PASS | 8192バイト |
| data_write | PASS | 64バイト |
| counter_stream | PASS | 5アイテム |
| counter_upload | PASS | 5アイテム |
パフォーマンスに関する注記
コネクションインターバルの影響
コネクションインターバル(CI)は、ラウンドトリップレイテンシの主要な要因です。各リクエスト・レスポンスサイクルには、最低2つのコネクションイベントが必要です:
- macOS (bleak): CI = 15ms → 約30msのラウンドトリップ
- iOS (iPhone 16): CI = 30ms → 約60msのラウンドトリップ
- Android (Pixel 5): CI = 30ms → 約60msのラウンドトリップ。ただし、コネクションイベントあたりのパケット数が多いため、最高のスループットを実現
ペリフェラルは推奨CIを15〜30ms(PREF_MIN_INT=12, PREF_MAX_INT=24)でアドバタイズします。実際のCIはCentral側のOSによって決定されます。
暗号化のオーバーヘッド
E2E暗号化はトランザクションあたり20バイトのオーバーヘッドを追加します(4バイトのカウンター + 16バイトのAES-GCMタグ)。大きなペイロード(8 KB)の場合、このオーバーヘッドは無視できる程度です(0.3%未満)。AES-128-GCMの暗号化/復号自体は、最新のモバイルデバイスではハードウェアアクセラレーションされ、8 KBのペイロードでも1ms未満で完了
スループット最適化
- nanopb FT_CALLBACK: フラッシュデータをprotobufエンコーディングに直接ストリーミングし、4 KBの静的RAMを節約
- ゼロコピーレスポンス: Protobufレスポンスをコンテナヘッダーオフセットに直接エンコード
- パケット間遅延なし: コンテナは連続して送信
- flash readは最大8KB: レイテンシとスループットの最適なバランス