Claude Codeのサブエージェント、並列にすると本当に速い・お得なのか実測してみた
前回はモデルごとのトークン消費比較をやりました。今回は第3弾として、Claude Codeのサブエージェント(Agentツール)を並列実行するとどれだけ効果があるのかを実際に測定してみます。
検証の動機
Claude Codeには「Agentツール」でサブエージェントに作業を委譲する機能があります。委譲するメリットとしてよく言われるのは以下の2点です。
- 速い: 独立したタスクを同時に処理できる
- メインの文脈を汚さない: サブエージェントの試行錯誤はメインセッションに残らず、要約された結果だけが返る
今回は所要時間・トークン消費・メインの文脈増加量の3つの指標で比較しました。
検証方法
同じ内容の独立した3タスク(「requests」「pytest」「pandas」というPythonライブラリについて、用途・代表メソッド3つ・簡単なコード例を300字程度で説明する)を、3つのやり方で実行しました。
| 群 | やり方 |
|---|---|
| ① 直列・サブエージェント無し | メイン(自分)が3件を順番に直接処理 |
| ② 直列・サブエージェント経由 | Agentツールを1件ずつ、順番に呼び出し |
| ③ 並列・サブエージェント経由 | Agentツールを1メッセージで3件同時に起動 |
計測は以下の3つです。
- 所要時間: 開始・終了時刻を記録
- メインセッションの新規追加量: メインのセッション会話に新規追加された量を集計
- 全体トークン消費量: 前回作った集計スクリプトを用いて集計
ログは通常 ~/.claude/projects/<project>/<session-id>.jsonl に保存されますが、サブエージェントは同じディレクトリ配下の subagents/agent-*.jsonl という別ファイルに記録されていました。この構造のおかげで「メインだけの増加量」と「サブエージェント込みの全体量」を分けて集計できました。
結果1: 所要時間
| 群 | 所要時間 |
|---|---|
| ① 直列・サブエージェント無し | 約9.5秒 |
| ② 直列・サブエージェント経由 | 約30.0秒 |
| ③ 並列・サブエージェント経由 | 約14.3秒 |
②→③で所要時間が半分弱に短縮されました。
①が最速なのは当然で、サブエージェントの起動が発生しないためです。
結果2: 全体トークン消費量(メイン+サブエージェント合算)
| 群 | メイン | サブエージェント | 合計(weighted_total) |
|---|---|---|---|
| ① 直列・サブエージェント無し | 40,770 | - | 40,770 |
| ② 直列・サブエージェント経由 | 60,616 | 58,578 | 119,194 |
| ③ 並列・サブエージェント経由 | 54,338 | 12,546 | 66,884 |
所感: ここが意外だったところです。③は②と比べて、トークンも大幅に少なく済みました(66,884 vs 119,194)。
③では新規キャッシュ書き込みがほぼ発生しておらず、代わりに既存キャッシュの読み込み、コストは約1/10が多くを占めていました。
同じタイミングで似た内容の3つのサブエージェントを起動したことで、定義部分のキャッシュを共有できたためだと考えられます。
つまり「独立したタスクを複数投げるなら、順番に1件ずつより、まとめて並列で投げた方がお得」となりました。
結果3: メインセッションの文脈がどれだけ汚れたか
| 群 | cache_write(新規追加量) |
|---|---|
| ① 直列・サブエージェント無し | 5,876 |
| ② 直列・サブエージェント経由 | 6,183 |
| ③ 並列・サブエージェント経由 | 3,473 |
所感: ここは想定していたほど劇的な差にはなりませんでした。
理由を考えてみると、そもそも今回頼んだタスクが一発勝負の作業で、実行ログを見てもtool_uses: 0(ツール呼び出しゼロ)で、一発で回答を返していました。
たとえるなら、部下に「下調べしてから資料を作って」と頼めば、下調べのメモは見せずに完成品だけ出してくれるので上司(メイン)の机は散らからずに済みます。
でも今回頼んだのは「一言で答えられる質問」だったので、部下も一発で答えを出しただけというわけです。
まとめ
-
速度: 並列化は素直に効果があり。
直列と比べて所要時間はおよそ半分 -
トークン消費: 並列の方がトークンが少ない。
同時に似た内容のサブエージェントを起動すると、キャッシュを共有できるため -
メインの文脈保護: 効果を確認できず。
今回頼んだタスクはサブエージェント側に"隠すべき試行錯誤"が無いため
独立したタスクが複数あるなら、まとめて並列に投げた方が速くも安くもなる、というのが結論です。文脈保護の効果についてはもっと重いタスクで検証しないと見えてこない可能性があるので、機会があればそちらでも同じ検証をしてみたいと思います。