アプリ/フロント基盤

Angularとは|確認を1割に減らす方式でも、最も多い1回は全部確認するのと同じだった

変化はどうやって見つけるのか確認を減らす方式は何を省くのか減らない場合はあるのか

部品400個・値2000箇所の木で、出来事を2000回起こしました。全部確認すると毎回2000回です。

印の道だけ見る方式なら平均188.7回まで落ちます。ただし最も多い1回は2000回のままでした。

この記事の要点

  • 全部なら2000回
  • 印の道だけで188.7回
  • 最大は2000回のまま
  • 値からなら3.0回

出発点は「木を全部たどる」

変化を知らせる記述はありません。代わりに、全部を見て違いを探す作りから始まります。

Angularの変化の見つけ方は、木の走査です。出典はこう述べています。

Angularは、データ構造の最新の状態が画面に反映されていることを確かめるために、部品の木の全体にわたって変化の検出を走らせるという記述です。

「全体にわたって」が出発点です。どこが変わったかを知らないまま、全部を見に行きます

この作りの利点

  1. 知らせる記述が要らない。普通の代入で足りる
  2. 取りこぼしがない。全部見るので見落とさない
  3. どんな書き方でも動く。値の持ち方を選ばない
  4. 回数が読める。値の数の掛け算で上限が出る

2番目が大きいものです。画面が更新されないという不具合が原理的に起きません

代償は回数です。部品400個・1部品あたり5箇所なら、1回の出来事につき2000回の確認になります。

上限は先に計算できる

この2000回という値は、部品の数と値の数を掛けるだけで出ます。測る前に分かります。

小さい画面なら問題になりません。効いてくるのは一覧が長い画面と、出来事が頻繁に起きる画面です。

出典Angular 公式ドキュメント「Skipping component subtrees」2026-08-18 確認
Angular runs change detection over your entire component tree to make sure that the most up-to-date state of your data structures is reflected in the DOM.
原文Angular 公式ドキュメント「Skipping component subtrees」 この内容の有効期限2027-02-18

確認を1割に減らす方式でも、最も多い1回は全部確認するのと同じだった

平均は9.4%まで落ちます。ただし根の近くで出来事が起きると、まったく減りません。

Angularは条件を満たす枝を飛ばせます。出典は新しい入力を受け取っていない、印のついた部品を根とする子孫の枝を、Angularは飛ばすと述べています。

どれだけ飛ばせるのかを数えました。出来事の起きる場所は木の中で無作為としています。

3つの方式で確認回数を数える

text
部品 400個の木。1部品が画面に出している値は 5個。出来事 2000回
出来事のたびに、変化した値を見つけるための確認回数を数える

やり方              1回あたりの確認  全体に対する割合  最も多かった1回
全部確認する                        2000回            100.0%           2000回
印の道だけ確認する                    188.7回              9.4%           2000回
読んだ値だけ確認する                     3.0回              0.2%              5回

平均は2000回から188.7回へ落ちます。10.6分の1です。

ところが右端の列は2000回のままです。減っていません。

減らないのはどこか

この方式が見るのは出来事の起きた部品から根までの道と、その部品より下の全部です。

根の近くで出来事が起きると、「その部品より下」がほぼ木全体になります。だから減りません。

実務では、根の近くに絞り込みの条件や画面全体の状態が置かれます。そこが動くたびに全部確認が走ります。

つまり効き目は出来事がどこで起きるかに依存します。平均だけを見ていると、この依存が見えません。

同じ方式でも、出来事の起きる場所で確認回数が2桁変わる。

1回の出来事で確認する範囲葉の近くで起きた根までの道だけ自分より下はわずか確認は数十回で済む中ほどで起きた道はそこそこ長い下も相応にある平均188.7回の中心根の近くで起きた下がほぼ木全体飛ばせる枝がない2000回になるMECE の根拠:出来事の起きた部品の位置で分けているため、どの出来事も必ずどれか1つに入る部品400個・出来事2000回での実測。平均は9.4%まで落ちるが、3つ目の場合はまったく減らない。
図1 ── 印の道だけ確認する方式が見る範囲
出典Angular 公式ドキュメント「Skipping component subtrees」2026-08-18 確認
Angular will skip descendant component subtrees with roots using OnPush, which have not received new inputs.
原文Angular 公式ドキュメント「Skipping component subtrees」 この内容の有効期限2027-02-18

値の側から知らせる作りに替えると、確認は3.0回になる

探しに行くのをやめて、知らせてもらう向きに変えます。木の形に左右されなくなります。

Angularには、値の側から知らせる仕組みもあります。出典は信号とは、値を包むものであり、その値が変わったときに、関心のある受け手へ知らせると定めています。

向きが逆になっています。探しに行くのではなく、知らせてもらう形です。

回数がどう変わるか

前の計測の3行目です。確認は平均3.0回、最も多い1回でも5回でした。

全体の0.2%です。印の道だけ確認する方式の188.7回と比べても63分の1になります。

大きいのは最大値のほうです。木のどこで出来事が起きても5回で、位置に依存しません。

代わりに払うもの

知らせるためには、誰が読んでいるかの記録が要ります。その記録は動かしている最中に作られます。

記録の量そのものはVueの記事で測っていて、値300個・処理120個で644件でした。

もう1つの代償は書き方です。普通の代入では知らせが飛びません。値を包む形に直す必要があります。

余談 この計測での注意

木の形は式で作ったもので、出来事の起きる場所は木の中で一様としました。実際には出来事が起きる場所に偏りがあり、それが葉の近くなら平均はもっと下がり、根の近くなら平均が2000回に寄ります。1部品5箇所という値も置いたものです。ここで見せているのは、平均が9.4%まで落ちても最大は変わらないという関係で、その最大は自分の画面の部品の数から計算できます。

出典Angular 公式ドキュメント「Signals」2026-08-18 確認
A signal is a wrapper around a value that notifies interested consumers when that value changes.
原文Angular 公式ドキュメント「Signals」 この内容の有効期限2027-02-18

よくある質問

Angularは変化をどう見つけますか
木をたどって確かめます。既定では部品の木全体を走査し、いまの状態が画面に反映されているかを確認します。
確認はどれだけ減らせますか
この計測では2000回が平均188.7回になりました。全体の9.4%です。
いつも減りますか
減りません。根に近い部品で出来事が起きると、その下が全部対象になり2000回のままでした。
もっと減らす方法はありますか
値の側から知らせる作りにすることです。この計測では平均3.0回、全体の0.2%になりました。

まとめ

  • 既定は木全体を確認する
  • 印のない枝は飛ばせる
  • 根の近くでは飛ばせない
  • 値からならその場所だけ

今日から始められること

  1. 画面の部品の数と値の数を数える
  2. どの部品で出来事が起きやすいか調べる
  3. その部品が木のどのあたりにあるか見る
  4. 根に近い部品の更新頻度を確かめる

実務で組んだAngularのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る