Claude Codeのサブエージェント並列実行、本当に速くて安いのか|逐次vs並列spawnを実測

2026.07.09 約 10 分で読めます
開いたノートに描かれた逐次と並列の比較。左は1体のエージェントが短い一本道でゴールへ、右は複数体が長い並列トラックで絡まり、時計とコインで時間もコストも増えることを表した手描き線画のアイキャッチ

「並列で投げれば速い」——サブエージェントの話でよく耳にします。でも、本当に速くて安いのか。合成の問い合わせ8件を、逐次1体と並列4体・8体で実際に回して、時間とトークンとコストを測りました。結果は、わたしの予想と逆でした。

結論:8件の軽いバッチでは逐次が最速・最安だった

先に数字を置きます。8件のような1件が軽いバッチでは、逐次が最速で最安でした。並列8体は逐次より時間で約1.6倍、トークンで約7.7倍もかかっています。体を増やすほど遅く、そして高くなりました。

方式子エージェントwall-clock合計トークンコスト概算(¥@160)
逐次1体 × 8件35.0秒42,204約¥21
並列44体 × 2件50.4秒163,328約¥82
並列88体 × 1件55.1秒324,652約¥164
逐次 vs 並列 spawn の実測(work/subagent-parallel/log.md)。wall-clock は spawn 発火から最終ワーカー終了まで。
逐次vs並列spawnの実測バーグラフ。体を増やすほどwall-clockもトークンも増え、逐次が最速最安という結論
体を増やすほど、時間もトークンも増えた。1件が軽いバッチでは逐次が最速・最安。

時間もトークンも、すべて自前の実測値です。数字の出どころは rapid-dev カテゴリ の他の検証記事と同じで、想像では埋めていません。ではなぜ、こうなったのか。

実験の設計(合成8件を逐次・並列4・並列8で回す)

題材は、架空 SaaS への問い合わせ8件です。実在の個人情報は使っていません。各件を「カテゴリ分類・40字要約・優先度」の3点で処理させました。今回はサブエージェント並列の効果だけを見たいので、タスク自体はわざと軽くしています。

  • 逐次:子エージェント1体が8件を順に処理
  • 並列4:4体を同時に spawn し、各2件を分担
  • 並列8:8体を同時に spawn し、各1件を分担

ワーカーのモデルは軽い分類なので sonnet を指定しました。検証は2026年7月、モデルのバージョンは Claude Sonnet 4.6 系(導入期は Sonnet 5)です。時間は各ワーカーが処理の前後で date +%s%3N を打刻しました。spawn 発火から最後の終了までを wall-clock として測っています。トークンは Claude Code が返す実測の消費量を使いました。

実測:体を増やすほど遅く・高くなった

分類そのものは速いです。1件あたり数秒で終わります。ところが子エージェント1体を立ち上げる spawn には、今回の観測で12〜32秒かかりました。処理より、起動の方が重いのです。

もうひとつ、意外だったこと。並列8体を一度に投げても、8体が本当に同時には走りませんでした。各ワーカーの開始時刻は階段状にずれ、同時に動いていたのは2〜3体ほど。合計トークンは体数にほぼ比例して、42k → 163k → 325k と膨らみました。

なぜ並列が損したのか

1. spawn オーバーヘッドが実処理より重い

子エージェントは毎回コールドスタートです。専用の system prompt とツール定義を読み込み、最初の一手を出すまでに時間がかかります。1件が数秒で終わる軽いタスクだと、この固定コストが全体を支配します。体を増やしても待ち時間は縮まりません。

2. 「同期 spawn」は完全には並列化されない

ここがサブエージェント並列でいちばん誤解しやすい点でした。公式ドキュメントにも 「サブエージェントは単一セッション内で動く。多数を本当に並列で回すならバックグラウンドエージェントを見よ」とあります。同期的にまとめて投げても、実体は逐次〜部分並列。理論値どおりの8並列にはなりませんでした。

3. 固定オーバーヘッドが体数分だけ重複する

公式ドキュメントは 「各サブエージェントは自分専用の context window で動く」と明言しています。つまり体ごとに固定の文脈を持ち直します。実測でも1体あたり約40kトークンをほぼ固定で消費し、実タスクの中身は2k程度でした。8体に割れば、40k × 8 で約320k。分割した瞬間に、固定コストを人数分だけ払い直す構図です。

品質は落ちたか(分類は8/8一致)

気になるのは精度です。文脈を分けると雑になるのでは、という不安。結果はサブエージェント並列でも、カテゴリ分類は3方式すべてで8件中8件が一致しました。優先度だけ一部でブレましたが、これは主観のゆらぎで、並列が原因ではありません。少なくともこの独立バッチでは、損したのは時間とコストの側でした。

並列が効く条件・損する条件

ここまで並列に厳しい数字が並びましたが、並列がダメという話ではありません。分かれ目は「1件あたりの処理時間」と「spawn オーバーヘッド(約20秒/体)」の大小です。

並列spawnが効く条件と損する条件の図。1件の処理時間がspawnオーバーヘッドを超えると並列が有利になる分岐点
1件の処理が spawn オーバーヘッドより十分重いなら、並列は時間を買える。軽いなら逐次。

サブエージェント並列が効くのは、1件が数分かかる重い処理を、独立に分割できて、本数が少ないときです。Σ(各処理時間) − max(処理時間) が spawn の重複コストを上回れば、初めて wall-clock が縮みます。役割別のコード調査や、章ごとの長文要約などが向きます。ただしトークンは必ず(体数−1)×約40k 増えるので、安くはなりません。時間を金で買う判断です。

逆に向かない場面は、今回のような軽いバッチ処理。1件が spawn オーバーヘッドを超えない限り、逐次で1体に全部やらせた方が速くて安上がりでした。この「予想が外れた」感覚こそ、実測しないと分からない部分です。

再現手順(コピペで動く形)

まず、繰り返し使うワーカーは再利用できるサブエージェントとして定義しておくと楽です。.claude/agents/ticket-classifier.md に置きます。

---
name: ticket-classifier
description: 問い合わせを分類・要約する軽量ワーカー
model: sonnet
tools: Bash
---
渡された問い合わせ文を「請求/技術サポート/解約/機能要望/その他」に
分類し、40字以内の要約と優先度(高/中/低)を返す。余計な探索はしない。

時間の計測は、処理の前後をミリ秒で打刻するだけです。そのまま貼れば動きます。

START_MS=$(date +%s%3N)
# ここで処理(分類・要約など)を実行
END_MS=$(date +%s%3N)
echo "elapsed_ms=$((END_MS - START_MS))"

並列時の wall-clock は、各ワーカーが吐いた開始・終了を集計します。logs.txt の各行に「START END」が並んでいる前提です。

# 最初の開始から最後の終了までを wall-clock として出す
awk 'NR==1{min=$1;max=$2}
     {if($1<min)min=$1; if($2>max)max=$2}
     END{print "wall_clock_ms=" max-min}' logs.txt

コスト概算は公式の単価で出せます。今回のワーカー(sonnet)は 公式 pricing で入力 $3・出力 $15(100万トークンあたり)。1体あたり約40kトークンなら、入力換算でおよそ $0.12 です。体を増やすほど、この額が素直に人数倍になります。

まとめ

  • 8件の軽いバッチでは、逐次が最速・最安(並列8体は時間1.6倍・トークン7.7倍)
  • 子エージェントの spawn は12〜32秒かかり、1件が軽い処理では起動が支配的
  • 同期 spawn は完全並列化せず、実体は逐次〜部分並列だった
  • 各サブエージェントは自分の context window を持つため、固定約40kが体数分だけ重複する
  • 分類精度は8/8で落ちない。損するのは時間とコストの側
  • 並列が効くのは「1件が重い×独立×少数」。時間を金で買う判断になる

サブエージェント並列は、便利ですが万能ではありません。まずは自分のタスクで逐次と並列を1回ずつ測るのが近道です。日々の消費を抑える工夫は Claude Code の hooks でコスト浪費を止める にまとめました。スキルやサブエージェントの設計は 自作スキルの設計判断と落とし穴 が参考になります。こうした費用対効果を踏まえた業務自動化は、法人向けにも設計から構築まで請け負っています。

こま

こま

元SE × AI開発 × 業務自動化の実践者

SE 4年 + プログラミング歴 8年。業務自動化と AI 組み込み開発を仕事にしながら、現場で使えるものだけを書いています。 最新のAIの現場を発信中!!