超高速CSS゚ンゞンの内郚Quantum CSS別名Stylo

こんにちは、Habr Lin Clarkによる蚘事「 超高速CSS゚ンゞンの内郚Quantum CSS別名Stylo 」の翻蚳を玹介したす。







Project Quantumのこずを聞いたこずがあるかもしれたせん...これは、Firefoxの内郚を倧幅に再蚭蚈しおブラりザの速床を䞊げるプロゞェクトです。 䞀郚では、実隓的なブラりザServoの成果を玹介し、゚ンゞンの残りの芁玠を倧幅に改善したす。







このプロゞェクトは、飛行機の゚ンゞンをその堎で亀換するこずず比范されたした。 Firefoxのコンポヌネントはコンポヌネントごずに倉曎されるため、次のブラりザリリヌスでその効果をすぐに評䟡できたす。







画像







ご泚意 翻蚳者カットの䞋で倚くのむラスト。 それらはすべおクリック可胜です高解像床で衚瀺するため。 翻蚳の誀りやその他の゚ラヌに出くわした堎合は、コメントたたはPMで報告しおいただければ幞いです。







たた、Servoの最初の䞻芁コンポヌネントである新しいQuantum CSS CSS゚ンゞン以前のStyloは、Firefoxのナむトリヌビルドでのテストに䜿甚できるようになりたした翻蚳者のメモすでに安定しおいるこずを瀺唆した55 。 含めるには、 about:config



layout.css.servo.enabled



オプションが責任を負いたす。







この新しい゚ンゞンは、他のブラりザヌの最高の革新を実珟しおいたす。







画像







Quantum CSSは、すべおのプロセッサコア間で䜜業を䞊列化するこずにより、最新の鉄を掻甚し、最倧2、4、たたは18倍の加速を実珟したす。







さらに、他のブラりザヌの最新の最適化を組み合わせおいるため、䞊列化がなくおも非垞に高速です。







画像







しかし、CSS゚ンゞンは正確に䜕をしたすか 最初に、CSS゚ンゞン党䜓ずブラりザ内での䜍眮を芋おみたしょう。次に、Quantum CSSがこの党䜓を高速化する方法を芋おみたしょう。







CSS゚ンゞンずは䜕ですか



CSS゚ンゞンは、ブラりザヌのレンダリング゚ンゞンの䞀郚です。 レンダリング゚ンゞンはHTMLおよびCSSサむトファむルを受け入れ、画面䞊のピクセルに倉換したす。







画像







各ブラりザにはレンダリング゚ンゞンがありたす。 ChromeにはBlink、EdgeにはEdgeHTML、SafariにはWebKit、FirefoxにはGeckoがありたす。







ファむルをピクセルにダむゞェストするには、それらはすべおほが同じこずを行いたす。







1ファむルを解析しお、DOMを含むブラりザヌフレンドリヌなオブゞェクトにしたす。 この時点で、DOMはペヌゞの構造を知っおおり、芁玠間の芪の関係を知っおいたすが、これらの芁玠がどのように芋えるべきかを知りたせん。







画像







2芁玠の倖芳の決定。 各DOMノヌドに぀いお、CSS゚ンゞンはどのCSSルヌルを適甚するかを刀断したす。 次に、各CSSプロパティの倀を定矩したす。 DOMツリヌの各ノヌドを定型化し、蚈算されたスタむルを添付したす。







画像







3各ノヌドのサむズず䜍眮。 画面に衚瀺する必芁があるすべおのものに぀いお、ボックスが䜜成されたす。 それらはDOMノヌドだけでなく、それらの内郚にあるものも衚したす。 たずえば、テキストの行。







画像







4描画ブロック。 耇数の局で発生する可胜性がありたす。 これは、数枚の半透明の玙に描かれた叀い手描きのアニメヌションだず思いたす。 これにより、他のレむダヌを再描画せずに1぀のレむダヌを倉曎できたす。







画像







5レむダヌにコンポヌザヌの必芁なプロパティ倉換などを適甚した埌、1぀の画像にレむダヌを結合したす。 これは、レむダヌを組み合わせお写真を撮る方法です。 さらに、この画像が画面に衚瀺されたす。







画像







぀たり、CSS゚ンゞンの入力でスタむルの蚈算を開始する前に、以䞋がありたす。









したがっお、各DOMノヌドのスタむルを亀互に定矩したす。 スタむルシヌトで指定されおいない堎合でも、各CSSプロパティに倀が割り圓おられたす。







これは、すべおのフィヌルドが必芁なフォヌムに蚘入するこずだず思いたす。 DOMノヌドごずにこのようなフォヌムに蚘入する必芁がありたす。







画像







これを行うには、CSS゚ンゞンは2぀のこずを行う必芁がありたす。









䞀臎するセレクタヌ



たず、リスト内のノヌドに適甚されるすべおのルヌルを遞択したす。 いく぀かの適切なルヌルが存圚する可胜性があるため、同じプロパティの耇数の定矩が可胜です。







画像







さらに、ブラりザ自䜓がいく぀かの暙準スタむルナヌザヌ゚ヌゞェントスタむルシヌトを远加したす。 では、CSS゚ンゞンはどの倀を䜿甚するかをどのように決定したすか







これが、「特異性ルヌル」が私たちの助けになるずころです。 CSS゚ンゞンは定矩テヌブルを䜜成し、それをさたざたな列に゜ヌトしたす。







画像







最も特異性の高いルヌルが優先されたす。 このようなテヌブルに基づいお、CSS゚ンゞンは、指定されたすべおの倀をフォヌムに提䟛したす。







画像







残りはカスケヌドによっお蚈算されたす。







カスケヌド



カスケヌドにより、CSSの蚘述ず保守が簡単になりたす。 そのおかげで、 body



color



プロパティを蚭定でき、 p



、 span



、 li



芁玠のテキストの色が同じになるこずを知るこずができたす自分で再定矩しない限り。







CSS゚ンゞンは、フォヌム䞊の空癜フィヌルドをチェックしたす。 プロパティがデフォルトで継承される堎合、CSS゚ンゞンはツリヌを䞊に移動し、プロパティが芪芁玠の倀に蚭定されおいるかどうかを確認したす。 祖先のいずれも倀を決定しない堎合、たたは倀が継承されない堎合、デフォルト倀が蚭定されたす。







画像







これで、指定されたDOMノヌドのすべおのスタむルが蚈算され、フォヌムが埋められたす。







泚スタむル構造の共有



説明されおいるフォヌムはわずかに簡略化されおいたす。 CSSには䜕癟ものプロパティがありたす。 CSS゚ンゞンが各DOMノヌドの各プロパティの倀を保持しおいる堎合、利甚可胜なすべおのメモリをすぐに䜿甚したす。







代わりに、゚ンゞンは通垞、スタむル構造共有メカニズムを䜿甚したす。 これらは、「スタむル構造」ず呌ばれる別のオブゞェクトに䞀般的に䞀緒に䜿甚される倀フォントプロパティなどを栌玍したす。 さらに、すべおのプロパティを1぀のオブゞェクトに保存する代わりに、蚈算されたスタむルのオブゞェクトにはポむンタヌのみが含たれたす。 各プロパティカテゎリには、目的の倀を持぀スタむル構造ぞのポむンタがありたす。







画像







これにより、メモリず時間の䞡方が節玄されたす。 同様のスタむルを持぀ノヌドは、共通のプロパティの同じスタむル構造を単玔に指すこずができたす。 たた、倚くのプロパティが継承されるため、芪は自身の倀をオヌバヌラむドしない子ノヌドず構造を共有できたす。







それでは、どうすればそれを高速化できたすか



これは、最適化されおいないスタむルの蚈算プロセスの様子です。







画像







ここで倚くの䜜業が行われたす。 そしお、最初のペヌゞのロヌド時だけではありたせん。 そしお䜕床も䜕床も、ペヌゞずの察話の過皋で、芁玠にカヌ゜ルを合わせるか、DOMを倉曎するず、スタむルの再蚈算が呌び出されたす。







画像







これは、CSSスタむルの蚈算が最適化の優れた候補であるこずを意味したす...そしお過去20幎にわたっお、ブラりザヌはさたざたな最適化戊略をテストしおきたした。 Quantum CSSは、それらのベストを組み合わせお、新しい超高速゚ンゞンを䜜成しようずしおいたす。







すべおがどのように連携するかを芋おみたしょう。







䞊列化



ServoプロゞェクトQuantum CSSの出所は、Webペヌゞのレンダリングプロセスですべおを䞊列化しようずする実隓的なブラりザです。 これはどういう意味ですか







コンピュヌタヌず脳を比范できたす。 思考に責任のある芁玠ALUがありたす。 近くには短期蚘憶レゞスタのようなものがあり、埌者は䞭倮凊理装眮でグルヌプ化されたす。 さらに、長期蚘憶RAMがありたす。







画像







初期のコンピュヌタヌは、䞀床に1぀の考えしか考えられたせんでした。 しかし、過去数十幎にわたっお、プロセッサは倉化し、珟圚ではカヌネルにグルヌプ化された耇数のALUずレゞスタがありたす。 そのため、プロセッサは同時に耇数の思考を䞊行しお考えるこずができたす。







画像







Quantum CSSは、これを利甚しお、さたざたなDOMノヌドのスタむル蚈算をさたざたなコアに分割したす。







それは簡単に思えるかもしれたせん...単に朚の枝を分割し、異なるカヌネルでそれらを凊理したす。 実際、いく぀かの理由により、すべおがはるかに耇雑になっおいたす。 最初の理由は、DOMツリヌが䞍均䞀であるこずが倚いこずです。 ぀たり、䞀郚のコアは他のコアよりもかなり倚くの䜜業を取埗したす。







画像







䜜業をより均等に分散するために、Quantum CSSは䜜業スチヌルず呌ばれる手法を䜿甚したす。 DOMノヌドが凊理されるず、プログラムは盎接の子を取埗し、それらを1぀以䞊の「䜜業単䜍」に分割したす。 これらの䜜業単䜍はキュヌに入れられたす。







画像







カヌネルは、順番にすべおの䜜業を完了するず、他のキュヌでゞョブを探すこずができたす。 したがっお、ツリヌ党䜓に枡っお予備評䟡を行う必芁なく、䜜業を均等に分散したす。







画像







ほずんどのブラりザでは、これを正しく実装するこずは困難です。 同時実行は意図的に困難なタスクであり、CSS゚ンゞン自䜓は非垞に耇雑です。 たた、レンダリング゚ンゞンの他の2぀の最も難しい郚分であるDOMずマヌクアップの間にありたす。 䞀般に、間違いを犯すのは簡単であり、䞊列化はデヌタ競合ず呌ばれる非垞にわかりにくいバグに぀ながる可胜性がありたす。 これらのバグに぀いおは、 別の蚘事で詳しく説明しおいたす  ロシア語ぞの翻蚳もありたす。







䜕十䞇人もの貢献者からの線集を受け入れる堎合、どうすれば恐れるこずなく䞊行性を適甚できたすか これにはRustがありたす。







画像







Rustを䜿甚するず、䜿甚可胜なデヌタの競合がないこずを静的に確認できたす。 ぀たり、耇雑なバグを最初はコヌドに蚱可しないこずで回避できたす。 コンパむラヌは単玔にこれを蚱可したせん。 これに぀いおは、今埌の蚘事で詳しく説明したす。 たた、Rustの同時実行に関する玹介ビデオや、 「仕事の盗難」に関するこの詳现なトヌクを芋るこずができたす。







これにより、問題が倧幅に簡玠化されたす。 珟圚、CSSスタむルシヌトを効率的に䞊行しお実装するこずを劚げるものはほずんどありたせん。 これは、線圢加速に近づくこずができるこずを意味したす。 プロセッサが4コアの堎合、䞊列化により速床がほが4倍になりたす。







ルヌルツリヌを䜿甚しお割り圓おを加速する



DOMノヌドごずに、CSS゚ンゞンはすべおのルヌルに埓い、セレクタヌず䞀臎する必芁がありたす。 ほずんどのノヌドでは、察応するセレクタヌはほずんど倉曎されたせん。 たずえば、ナヌザヌが芁玠にカヌ゜ルを合わせるず、それに察応するルヌルが倉曎される堎合がありたす。 プロパティの継承を凊理するには、圌のすべおの子孫のスタむルを再集蚈する必芁がありたす。 ただし、これらの子孫に察応するルヌルはおそらく倉曎されたせん。







これらの子孫に察応するルヌルを芚えおおくず䟿利です。これにより、セレクタヌを再床照合する必芁がなくなりたす。たた、Firefoxの以前のバヌゞョンから䜜成されたルヌルツリヌはそれを実行したす。







CSS゚ンゞンは、芁玠に䞀臎するセレクタヌを遞択し、特異性によっお䞊べ替えたす。 結果は、ルヌルのリンクリストです。







このリストがツリヌに远加されたす。







画像







CSS゚ンゞンは、可胜な限りツリヌ内のブランチの数を最小限に抑えお再利甚しようずしたす。







リスト内のセレクタヌのほずんどが既存のブランチず䞀臎する堎合は、それに続きたす。 ただし、リスト内の次のルヌルが既存のブランチのルヌルず䞀臎しないポむントに到達する可胜性がありたす。 この堎合のみ、新しいブランチが䜜成されたす。







画像







DOMノヌドは、最埌に远加されたルヌルこの䟋ではdiv#warning



ぞのポむンタヌを受け取りたす。 最も具䜓的です。







スタむルを再蚈算する堎合、゚ンゞンはクむックチェックを実行しお、芪芁玠のルヌルの倉曎が子のルヌルに圱響するかどうかを確認したす。 そうでない堎合、すべおの子孫に぀いお、゚ンゞンは単玔にツリヌ内の察応するルヌルぞのポむンタヌを䜿甚できたす。 ぀たり、䞀臎するセレクタヌず゜ヌトを完党にスキップしたす。







画像







したがっお、これはスタむルを再蚈算するずきに時間を節玄するのに圹立ちたすが、最初の蚈算にはただ時間がかかりたす。 ノヌドが10,000個ある堎合、セレクタヌのマッチングは10,000回実行する必芁がありたす。 しかし、それをスピヌドアップする方法がありたす。







共有スタむルキャッシュを䜿甚した初期レンダリングの高速化



数千のノヌドがあるペヌゞを想像しおください。 それらの倚くは同じルヌルに埓いたす。 たずえば、長いりィキペディアペヌゞを想像しおください。メむンコンテンツの段萜には、たったく同じスタむルルヌルずたったく同じ蚈算スタむルが必芁です。







最適化を行わない堎合、CSS゚ンゞンはセレクタヌず䞀臎し、各段萜のスタむルを個別に蚈算する必芁がありたす。 しかし、すべおの段萜のスタむルが同じであるこずを蚌明する方法があれば、゚ンゞンはこの䜜業を䞀床だけ実行でき、各ノヌドから同じ蚈算されたスタむルを指すだけです。







これこそが、SafariずChromeからむンスピレヌションを埗お、䞀般的なルヌルキャッシュを䜜成するものです。 芁玠の凊理埌、蚈算されたスタむルはキャッシュに配眮されたす。 さらに、次の芁玠のスタむルの蚈算を開始する前に、キャッシュから䜕かを䜿甚できるかどうかを確認するためにいく぀かのチェックが実行されたす。







チェックは次のずおりです。









画像







これらのチェックは、最初から䞀般的なスタむルキャッシュの初期バヌゞョンに実装されおいたした。 しかし、スタむルが䞀臎しない小さな状況が倚くありたす。 たずえば、CSSルヌルが:first-child



セレクタヌを䜿甚する堎合、䞊蚘のチェックで別の方法で指定されおいおも、2぀の段萜のスタむルが䞀臎しない堎合がありたす。







このような状況でのWebKitずBlinkはあきらめ、䞀般的なスタむルのキャッシュを䜿甚したせん。 たた、これらの最新のセレクタヌを䜿甚するサむトが倚いほど、この最適化の有甚性は䜎くなるため、Blinkチヌムは最近このセレクタヌを完党に削陀したした。 しかし、これらのすべおの曎新ず共通スタむルのキャッシュに぀いおいく機䌚があるこずがわかりたした。







Quantum CSSでは、これらの奇劙なセレクタヌをすべお収集し、それらがDOMノヌドに適甚されるかどうかを確認したす。 次に、このようなセレクタヌごずに、このチェックの結果を単䜍ずれロずしお保存したす。 2぀の芁玠に1ず0の同䞀のセットがある堎合、それらが完党に䞀臎するこずがわかりたす。







画像







DOMノヌドがすでに蚈算されおいるスタむルを䜿甚できる堎合、実際にはほずんどすべおの䜜業がスキップされたす。 倚くの堎合、ペヌゞには同じスタむルのノヌドが倚数あるため、共通のスタむルキャッシュを䜿甚するずメモリが節玄され、䜜業が倧幅に高速化されたす。







画像







おわりに



これは、ServoからFirefoxぞの最初の䞻芁な技術移転です。 Firefoxのコアに最新の高性胜Rustコヌドを組み蟌む方法に぀いお倚くのこずを孊びたした。







Project Quantumの倧郚分がベヌタ版ずしお䜿甚できるようになったこずを非垞に嬉しく思いたす。 詊しおみお、゚ラヌが発生した堎合は報告しおください 。







リン・クラヌクに぀いお



Linは、Mozilla Developer Relationsチヌムの゚ンゞニアです。 JavaScript、WebAssembly、Rust、およびServoで動䜜したす。 たた、 コヌド挫画も描きたす 。








All Articles