部品400個・値2000箇所の木で、出来事を2000回起こしました。全部確認すると毎回2000回です。
印の道だけ見る方式なら平均188.7回まで落ちます。ただし最も多い1回は2000回のままでした。
変化を知らせる記述はありません。代わりに、全部を見て違いを探す作りから始まります。
Angularの変化の見つけ方は、木の走査です。出典はこう述べています。
Angularは、データ構造の最新の状態が画面に反映されていることを確かめるために、部品の木の全体にわたって変化の検出を走らせるという記述です。
「全体にわたって」が出発点です。どこが変わったかを知らないまま、全部を見に行きます。
2番目が大きいものです。画面が更新されないという不具合が原理的に起きません。
代償は回数です。部品400個・1部品あたり5箇所なら、1回の出来事につき2000回の確認になります。
この2000回という値は、部品の数と値の数を掛けるだけで出ます。測る前に分かります。
小さい画面なら問題になりません。効いてくるのは一覧が長い画面と、出来事が頻繁に起きる画面です。
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
平均は9.4%まで落ちます。ただし根の近くで出来事が起きると、まったく減りません。
Angularは条件を満たす枝を飛ばせます。出典は新しい入力を受け取っていない、印のついた部品を根とする子孫の枝を、Angularは飛ばすと述べています。
どれだけ飛ばせるのかを数えました。出来事の起きる場所は木の中で無作為としています。
部品 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桁変わる。
Angular will skip descendant component subtrees with roots using OnPush, which have not received new inputs.原文Angular 公式ドキュメント「Skipping component subtrees」 この内容の有効期限2027-02-18
探しに行くのをやめて、知らせてもらう向きに変えます。木の形に左右されなくなります。
Angularには、値の側から知らせる仕組みもあります。出典は信号とは、値を包むものであり、その値が変わったときに、関心のある受け手へ知らせると定めています。
向きが逆になっています。探しに行くのではなく、知らせてもらう形です。
前の計測の3行目です。確認は平均3.0回、最も多い1回でも5回でした。
全体の0.2%です。印の道だけ確認する方式の188.7回と比べても63分の1になります。
大きいのは最大値のほうです。木のどこで出来事が起きても5回で、位置に依存しません。
知らせるためには、誰が読んでいるかの記録が要ります。その記録は動かしている最中に作られます。
記録の量そのものはVueの記事で測っていて、値300個・処理120個で644件でした。
もう1つの代償は書き方です。普通の代入では知らせが飛びません。値を包む形に直す必要があります。
木の形は式で作ったもので、出来事の起きる場所は木の中で一様としました。実際には出来事が起きる場所に偏りがあり、それが葉の近くなら平均はもっと下がり、根の近くなら平均が2000回に寄ります。1部品5箇所という値も置いたものです。ここで見せているのは、平均が9.4%まで落ちても最大は変わらないという関係で、その最大は自分の画面の部品の数から計算できます。
A signal is a wrapper around a value that notifies interested consumers when that value changes.原文Angular 公式ドキュメント「Signals」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る