ベンチマーク
asyncmux の性能特性を、benchmarks/asyncmux.bench.ts による測定結果とともに示します。 ここに載せる数値は特定の環境での参考値であり、実行環境によって変動します。
測定方法
測定には Vitest のベンチマーク機能を用いています。 各ケースは約 0.5 秒間繰り返し実行され、ops/sec は 1 秒あたりの実行回数を表します。
sh
npx vitest bench --config ./.config/vitest.bench.ts測定環境は次のとおりです。
- CPU: 12th Gen Intel Core i9-12900K
- メモリー: 32 GiB
- Node.js: v24.15.0
- 測定日: 2026-09-08
測定結果
A. 競合なしのロック取得
待ち行列が存在しない状態での lock / rLock の取得と解放の速度です。
| ケース | ops/sec | 平均 | p99 |
|---|---|---|---|
lock / release(キーなし) | 1,196,752 | 0.0008 ms | 0.0012 ms |
lock / release(キーあり) | 972,952 | 0.0010 ms | 0.0020 ms |
rLock / release(キーなし) | 1,181,629 | 0.0008 ms | 0.0011 ms |
rLock / release(キーあり) | 834,585 | 0.0012 ms | 0.0015 ms |
B. 低い競合
2 つのワーカーが同一キーに対して取得と解放を繰り返す場合の速度です。
| ケース | ops/sec | 平均 | p99 |
|---|---|---|---|
| 2 ワーカー × 4 回操作(同一キー) | 77,059 | 0.0130 ms | 0.0144 ms |
| 2 ワーカー × 16 回操作(同一キー) | 24,165 | 0.0414 ms | 0.0397 ms |
C. 高い競合
多数の要求が同時に同一のロックへ殺到した場合の速度です。
| ケース | ops/sec | 平均 | p99 |
|---|---|---|---|
| 32 件の同時要求(キーなし) | 22,103 | 0.0452 ms | 0.0425 ms |
| 128 件の同時要求(同一キー) | 2,011 | 0.4972 ms | 0.5530 ms |
D. ロック取得と解放の繰り返し
1 つのワーカーが取得と解放を連続で繰り返す場合の速度です。
| ケース | ops/sec | 平均 | p99 |
|---|---|---|---|
| 連続 16 回 | 59,214 | 0.0169 ms | 0.0172 ms |
| 連続 64 回 | 16,500 | 0.0606 ms | 0.0582 ms |
E. キューに溜まった要求の処理
保持中のロックを解放し、キューに溜めた読み書き要求を一括で流す場合の速度です。
| ケース | ops/sec | 平均 | p99 |
|---|---|---|---|
| 50 件の読み書き要求を処理 | 13,877 | 0.0721 ms | 0.0648 ms |
| 200 件の読み書き要求を処理 | 3,044 | 0.3285 ms | 7.4403 ms |
F. エラー経路
ロックの二重解放や、中断済みシグナルでの取得といった例外系の速度です。
| ケース | ops/sec | 平均 | p99 |
|---|---|---|---|
二重解放(LockReleasedError を投げる) | 222,488 | 0.0045 ms | 0.0065 ms |
| 中断済みシグナル(拒否される) | 159,919 | 0.0063 ms | 0.0068 ms |
G. 待機の取り消し
キューで待機中の取得を AbortSignal で取り消す場合の速度です。
| ケース | ops/sec | 平均 | p99 |
|---|---|---|---|
| 待機中の取り消し | 106,592 | 0.0094 ms | 0.0087 ms |
H. 現実的な負荷
読み取り 12 件と書き込み 3 件に全体ロック 1 件を混ぜた、キャッシュアクセスを模した負荷での速度です。
| ケース | ops/sec | 平均 | p99 |
|---|---|---|---|
| 読み書き混在アクセス(12R + 3W +全体 W) | 43,378 | 0.0231 ms | 0.0230 ms |
結果の読み方
競合なしのロック取得は 100 万 ops/sec を超えており、通常の非同期処理に付随する排他制御の負荷は無視できる水準にあります。 読み取りロックと書き込みロックの間に大きな速度差はなく、キー指定の有無も結果を大きく変えません。 128 件が同時に殺到するような高い競合下でも 1 件あたり 0.5 ms 程度で処理でき、読み書き混在の現実的な負荷では 4 万 ops/sec を超えています。