ブラりザヌのリ゜ヌスを節玄し、Webを䞭断しない方法。 Yandexレポヌト

デバむスのパフォヌマンスは向䞊しおいたすが、メモリずプロセッサに察するWebの芁求はたすたす厳しくなっおいたす。 タブ間のリ゜ヌスの適切なレンダリングずスマヌトな割り圓おは、この問題を解決する重芁な郚分です。 Konstantin Kramlikh PurplePowderは、 カンファレンス 「I Frontend」での講挔で、ChromiumプロゞェクトずYandex.Browserの䞡方で生産性を向䞊させ、リ゜ヌスを節玄するアルゎリズムに専念したした。



それらのいく぀か-たずえばHibernateテクノロゞヌ-は、 別の投皿で既に゜ヌトされおいたす。 ボヌンレポヌトでは、タブの切り替えの芳点からだけでなく、コンテンツ、タむル、ペヌゞレむダヌのレンダリング方法も考慮しお、問題をより広範囲にカバヌしおいたす。



最埌に、Webむンタヌフェヌスの開発者は、Webサむトのパフォヌマンスの問題を特定しお解決する方法を孊ぶこずができたす。





-私の名前はKostyaです。Yandex.Browserチヌムの内郚コンポヌネント開発グルヌプの責任者です。 ブラりザでは、ブラりザでのすべおのデコヌドから、すべおのHTML5ビデオから、レンダリング、レンダリング、その他の同様のプロセスに至るたで、5幎䜙りにわたっおさたざたなこずを行っおきたした。



過去1幎半から2幎間、私はブラりザヌのリ゜ヌスの節玄に関連するプロゞェクトCPU、メモリヌ、バッテリヌに携わっおきたした。



あなたは蚀う-コスティア、2019幎の庭で、リ゜ヌスの問題はどこにありたすか 必芁なデバむスを任意のリ゜ヌスで賌入できたす。 しかし、オヌプンMozilla統蚈に目を向けるず、ナヌザヌの半分が4 GB以䞋のメモリを持っおいるこずがわかりたす。 たた、1぀たたは2぀の物理コアを持぀倚くのナヌザヌは、芖聎者のかなりの郚分を占めおいたす。 この䞖界では私たちは生きおいたす。







このタブは頻繁に衚瀺されたすか これは、RAMず叀いコンピュヌタヌがほずんどない䞀般ナヌザヌの堎合に正確に起こりたす。







どうする 問題は誰にも秘密ではありたせん、圌らは3幎前に積極的にそれず戊い始めたした。 それ以来、ナットはさたざたな方法で埐々に締め付けられおきたした。 2016幎ごろにStack Overflowを行った䟋を玹介したす。 これは非垞に単玔なスニペットです。 これはタむトルを曎新するだけで、この関数の最埌の起動から経過した時間を蚭定したす。 理想的には䜕を入手すべきですか タむトルの100ミリ秒ごずに+ -100ず蚘述する必芁がありたす。 ラッキヌ。







しかし、開いお開くずどうなりたすか 誰かがこれに遭遇したしたか Stack Overflowに質問がありたしたなぜCookie Clickerがバックグラりンドタブで機胜しなくなるのですか これは、ブラりザヌでのCPU䜿甚量を削枛するこずを目的ずした最初のChromiumむニシアチブの1぀でした。 そのアむデアは、ナヌザヌが今タブを䜿甚しおいなければ、今はそれを必芁ずしないずいうこずでした-それにJSを付けたしょう。



ブラりザは、このタブのCPU負荷を玄1に維持しようずしたす-あらゆる皮類のタむマヌ、JS実行などの䞀時停止を開始したす。これは明るい未来の最初のステップの1぀です。







ブラりザでしばらくするず、バックグラりンドタブがたったく機胜しなくなるずいう状況になりたす。 これは私が話しおいる明るい未来です。 前回のBlinkOnで発蚀したChromiumの蚈画によるず、2020幎にはそうする予定です。タブをロヌドし、バックグラりンドの堎合は䜕もしたせん。 これには垞に準備が必芁です。







Yandex.Browserでは、このような問題も凊理したしたが、あたり明確に解決せず、Web党䜓を砎壊するこずはありたせんでした。 プロセッサのデコヌドをオフにし、ビデオカヌドのデコヌドのみを残す省゚ネモヌドを䜜成したした。たた、FPSを䞋げ、珟圚䞍芁でナヌザヌがバッテリヌを節玄する必芁のあるアニメヌションを無効にしたす。 これにより、玄1時間のバッテリヌ寿呜が延長されたした。 ixbtなど、 checkedなど、誰でもチェックできたす 。







Kostya、あなたはりェブを「壊した」、䞀郚のナヌザヌを助けたが、もっず賢いものは思い぀かなかったず蚀う人もいるず思う。 ハヌドコアを远加 ブラりザはどのようにペヌゞを描画したすか







簡単に蚀えば、レむダヌの抂念は、ブラりザヌがペヌゞをレむダヌに分割しお個別に描画しようずするこずです。 これは、䞀郚のアニメヌションが実行され、静的なものを匷制的に再描画しないようにするために行われたす。 ブラりザはこれを異なるヒュヌリスティックで行いたす。 たずえば、ビデオ芁玠を遞択しお別のレむダヌに入れようずしたす。これは、明らかに迅速か぀頻繁に再描画されたす。 そしお、それがどこかに衚瀺される堎合、その䞋のすべおを再描画する必芁はありたせん。



さらに、各レむダヌは256 x 256の長方圢のタむルに分割されおいたす。むンスペクタヌでは、このようなものを芋るこずができたす。 たくさんのタむルに分割されたフレヌムがありたす。











それは䜕で、なぜ必芁なのですか たず、レンダリングの優先順䜍を決定したす。 私たち党員が描く巚倧な゜ヌセヌゞがある堎合、ナヌザヌがViewPortで今持っおいるものだけを芋るのであれば、なぜ私たちはすべおこれを描く必芁があるのですか







このアプロヌチを䜿甚しお、最初にViewPortでナヌザヌに衚瀺されおいるものだけを描画し、次にタむルの呚りを1぀描画しおからスクロヌルの方向に描画したす。 ナヌザヌが䞋にスクロヌルする堎合-䞋に描く、䞊にスクロヌルする-䞊。 これらすべおのタむルは、これらのタむルに割り圓おがあり、それらを描画できる堎合にのみ描画されたす。その埌、ナヌザヌはそれらを芋るこずができたす。 たたは倚分決しお。







たた、障害を持぀倚くの人に圹立ちたす。 ナヌザヌがペヌゞを開いお䜜品を遞択し、すべおを再描画する必芁がないずしたす。 以前のレンダリングのほずんどを残すこずができたす。 ここで6枚のタむルを再描画したす。すべおが正垞になりたす。







このレベルでは、いく぀かの非垞に成功した最適化が行われたした。 たずえば、Chromiumは2017幎頃にそのような最適化を行いたした。







レンダリングが小さい堎合は、それだけを行いたす。 その埌、カヌ゜ルが点滅し、カヌ゜ル領域のみを再描画したすが、このタむルの領域党䜓は再描画したせん。 すべおを再描画しないように、CPUを倧幅に節玄したす。







たた、メモリの節玄にも圹立ちたす。 ここで問題は䜕ですか 党䜓が癜い長方圢。 256 x 256テクスチャ、ピクセルあたり4バむトになるず想像しおください。 この領域は、座暙、幅、高さ、色の5぀の数字で゚ンコヌドできるように芋えたすが。







Chromiumでは、モノクロ領域の最適化が行われたした。 ブラりザがこの長方圢にレンダリングがないこず、完党にモノクロであり、透明ではなく、他の条件を満たしおいるこずを理解しおいる堎合、ビデオカヌドに指瀺したす-癜い長方圢を描画し、テクスチャ党䜓を遞択しないでください。



ここで他に最適化できるものは䜕ですか 残りのタむルを芋るず、小さなコンテンツず癜い色の倧きな領域がありたす。 Yandex.Browserでは、これに぀いお考え、アダプティブタむルず呌ばれるメカニズムを䜜成したした。







1぀の小さな長方圢、タむルがありたす。 タむルの䞭倮にはほずんどコンテンツがありたせん。 私たちはそれを遞択し、そのすぐ䞋にテクスチャヌを䜜りたす。 他のすべおもビデオカヌドに぀いお話しおいるいく぀かの領域に分割されおいたす。このサむズの癜で描画するだけです。







ペヌゞは、赀で匷調衚瀺されおいるすべおのものの保存も開始したす。 より耇雑なペヌゞでは、このように芋えたす。







ただ倚くのレむダヌがあり、各レむダヌはこのように描かれおいるこずを理解するこずが重芁です。 各レむダヌで、ある皋床のメモリを節玄できたす。 このアプロヌチにより、すべおのナヌザヌの平均でビデオメモリの玄40を節玄できたした。



もっずハヌドコア 圌らはここで少しのメモリを節玄し、りェブを「砎壊」したした。りェブをさらに「砎壊」したせんか



Chromiumにはポリシヌのようなものがありたす。ナヌザヌがバックグラりンドタブを䜿甚しない堎合、ナヌザヌがタブを残した堎合、それらは必芁ありたせん。 メモリがなくなっおブラりザが暪になった堎合、ナヌザヌが長い間䜿甚しおいない最も叀いタブを取り、それを匷制終了したす。 圌女はむンタヌフェヌスに残りたすが、プロセスはもう存圚せず、すべおのJSは死にたす。 それは倧䞈倫ですか フロント゚ンドパヌティヌでこのような質問をし、「䜕をしおいるの」以倖の答えを期埅するのは奇劙です。







その埌、それはあたり行きたせんでした。 Chromiumブログからの実際のコメントは次のずおりです。あなたは私のすべおのアプリケヌションを壊したした。ある皮のゲヌムがありたした-そしおホップ、それは状態がありたせん。 アンロヌドハンドラヌが機胜しなかったこずを理解するこずが重芁です。このタブを配眮しただけです。 その埌、ナヌザヌはそこに戻り、䜕も起こらなかったようにネットワヌクからリロヌドしたす。



その埌、このアプロヌチは䞀時的に攟棄され、より思慮深い真剣なアむデアを思い぀きたした。 圌らは圌女を捚おず呌びたした。







ポむントは䜕ですか これはタブの削陀ず同じですが、制埡のみです。 スマヌトワヌドPage Lifecycle APIず呌ばれたす 。 タブがあり、ナヌザヌが長時間タブを衚瀺しおいない堎合、タブはフリヌズ状態になりたす。 ブラりザはむベント䞭に次のように蚀いたす今私はあなたを凍らせおいたす。 むベント凊理埌、䜕も実行されたせん。 必芁なこずを行い、準備をしたす。



その埌、再開むベントを通じお凍結状態を終了できたすが、おそらく䜕も起こりたせんでした。 たたは、ブラりザが本圓にメモリをすぐに解攟する必芁がある堎合は、それを取埗しお匷制終了したす。 しかし、ナヌザヌがこのタブに戻った堎合、それをリロヌドし、ドキュメントの廃棄フィヌルドを蚭定したす。







珟時点では、これらのむベントをすでにサブスクラむブしおキャッチし、䜕らかの方法で凊理できたす。 タブが本圓に削陀されおいる堎合、砎棄されたフィヌルドを確認できたす。 これは、砎棄埌に埩元されたこずを意味したす。 以前の状態を埩元できたす。







Yandex.Browserで私たちは数幎前に考えたした耇雑な基本的なアプロヌチを䜿甚しない理由。 圌らは圌を䌑止状態ず呌びたした。







ポむントは䜕ですか いく぀かのタブ、ある皮のJSが実行されおいる、ある皮の状態がありたす。 タブごずに個別のプロセスが䜜成されたす。ここではビデオを再生でき、ここではフォヌムに䜕かを残したす。 Hibernateが到着し、プロセスはありたせん。 私達は皆それらを埗た。 しかし、これらのタブに切り替えるず、プロセスが戻り、状態党䜓が配眮され、ビデオは適切な瞬間から再生され続け、フィヌルド内のすべおのテキストはそのたた残りたす。







私たちは䜕をしたしたか 各レンダラヌ内には3぀の最も重芁なものがありたす。JS党䜓を実行するV8、DOM党䜓を保存するBlink、およびすべおをタブなどで接続するための䜕らかのブラりザヌバむンディングです。







たずえば、サンプルを考えおみたしょう。 ここで、onloadが発生するのを埅ち、DOMツリヌに新しいdiv芁玠を远加したす。 ブラりザの堎合、次のようになりたす。







圓然、DOMツリヌがあり、いく぀かのフィヌルド、関連するオブゞェクトがあり、そのような゚ンティティがありたす。







V8では、各ノヌドの状態が保存され、これらのノヌドはバむンダヌのレむダヌを介しお点滅オブゞェクトに関連付けられたす。 私たちは䜕をしたしたか V8からシリアラむザヌを取埗し、V8の状態党䜓をシリアラむズし、関連するすべおのオブゞェクトをBlinkで芋぀け、さらにDOMツリヌ党䜓を保存しおシリアラむズし、ディスクに曞き蟌み、圧瞮および暗号化するシリアラむザヌを䜜成したした。 そしお、そのようなスナップショットから回埩するようブラりザに教えたした。 ぀たり、ナヌザヌがそのようなタブに移動するず、そのタブを展開し、解読しおナヌザヌに衚瀺し、完党に埩元したす。  Hibernateに関する別の投皿 - 箄 



珟圚、Hibernateは安定した党員に公開されおおり、各ナヌザヌが平均1぀たたは2぀のタブを保存できるようになっおいたす。 ぀たり、圌は平均しお垞に1぀のタブ、たたはおそらく2぀のタブを保存しおいたす。 これにより、10個を超えるタブを持っおいるナヌザヌのメモリが節玄されたす-あなたず同じですが、私たちは代衚ではありたせん。



ブラりザがどのように手助けをしようずしおいるのかを説明したしたが、今床は各自がサむトを高速化し、パフォヌマンスを改善するために䜕かをするこずができたす。 今日すぐに来お、するこずができたす。



たず、メモリの問題があるかどうかを理解する必芁がありたす。







特定の症状がありたす。サむトが劣化し始めるか、フェヌドが衚瀺されたす。 通垞、これは、ガベヌゞコレクタヌがトリガヌされ、党䞖界が凍結され、䜕も描画されないこずを意味したす。 たたは、サむトの速床が絶えず䜎䞋するこずもありたす-これも起こりたす。



問題があるかどうかを理解する必芁がありたす。 JSメモリで䜕が起こるかを芋おみたしょう。







圌女が前埌にゞャンプしたり、継続的に成長する堎合、これは良い症状ではありたせん。 たたは継続的に成長しおいたす。







この堎合、DevToolsを䜿甚しおい぀でもスナップショットを取埗できたす。 JSのリヌクに悩たされおいる人はいたすか 誰かが知らない堎合、JSでリヌクが発生する可胜性がありたす。







たずえば、ツリヌに挿入されおいないノヌドを远加するグロヌバル倉数がありたす。 あなたはそれらを忘れお、それから圌らは数癟キロバむト、あるいはメガバむトさえ食べおいるこずがわかりたす。







厳密に蚀えば、このような切り離されたノヌドをどうするかは明確ではありたせん。 それらをツリヌから匕き出しおから、挿入し盎すこずができたす。 通垞、写真の状態たたは䜕か他のものが圌らに残っおいるからです。 したがっお、それらを芋぀けお問題を凊理できたす。







タむムラむンでメモリ割り圓おを確認するこずもできたす。 䜓系的な退院があり、䜕もきれいにしない堎合-これも悪い兆候です。誰もがこれを理解しおいるず思いたす。







そしお、タブのレむダヌで遊ぶこずができたす。 ブラりザヌは通垞、この点でヒュヌリスティックを䜿甚しお動䜜したす。頻繁に倉化するず芋なされるオブゞェクトを別々のレむダヌに分離しようずしたす。 しかし、時にはあたりうたくいかず、倚くのメモリを消費するレむダヌがたくさんあるこずがわかりたす。 このような状況があるかどうかを垞に確認し、䞀郚のレむダヌを削陀しお、このレむダヌが占有しおいるメモリ量を確認できたす。







問題の別の局はパフォヌマンスです。 setTimeoutは、アニメヌションには適しおいたせん。 ブラりザがペヌゞをレンダリングする方法では機胜したせん。 フェヌズで動䜜しない堎合がありたす。ブラりザはフレヌムを芁求したしたが、setTimeoutが動䜜しなかったため、アニメヌションはただありたせん。 たたは、䜕も描画する必芁がない堎合でも機胜したす。 ナヌザヌは退出したしたが、ただバックグラりンド䜜業が残っおいたすが、setTimeoutを䜿甚しお䜜業したす。



これは、ブラりザがこのペヌゞを描画する必芁がある堎合にのみコヌルバックが呌び出す正しいアプロヌチです。







たた、ブラりザが1秒あたり60フレヌムを描画する堎合、各フレヌムに玄16ミリ秒が必芁であるこずを思い出しおください。







たた、メむンストリヌムを16ミリ秒より長く占有するず、フレヌムスキップが保蚌されたす。これはナヌザヌにずっおかなり䞍快なものです。サむトが動き始めたす。 したがっお、すべおのハヌドワヌクはバックグラりンドスレッドに正しく配眮され、単玔に結果が返されたす。







たたは、別のアプロヌチはマむクロタスクを䜿甚するこずです。 タスクキュヌを䜜成し、しばらくしおからクォヌタが終了するたで凊理し、ブラりザに静かにペヌゞを描画させたす。







圓然、新しいレむダヌを远加できたす。 ブラりザはヒュヌリスティックに基づいお動䜜し、必芁ず思われるレむダヌを遞択しようずしたす。 ただし、この芁玠が今すぐアニメヌション化されるこずがわかっおいる堎合は、別のレむダヌでこの芁玠を遞択する必芁があるこずをブラりザヌに明瀺的に通知するこずをお勧めしたす。 その埌、より効率的に描画されたす。







最新の興味深いアプロヌチ-文句を蚀う。 問題がある堎合は、来お話をするこずは垞に圹立ちたす。 たぶん、この問題は簡単に察凊でき、お互いに助け合うでしょう。



少しの背景。 この機胜は珟圚機胜しおいたす。 怜玢゚ンゞンペヌゞの開発チヌムがやっおきたした。 最初のスニペットのレンダリング時間などのメトリックがありたす。 ナヌザヌがクリックする必芁のある最初のリンクを以前に衚瀺し、そのリンクが正しい答えを提䟛する可胜性が高い堎合、できるだけ早くリンクするこずをお勧めしたす。 圌らはやっおきお、今床はどうにかしおスピヌドを䞊げるこずができるかず尋ねたした。



調査し、性胜テストを実斜し、プロトタむプを䜜成したした。サむトが最初に䜕を描画するかを教えおくれれば、これができるこずがわかりたした。 テストしお、パフォヌマンスが向䞊するこずを確認したした。 珟圚、私たちはこれを少数の聎衆のために実皌働でテストしおいたす。 私たちはそれがどうなるのかを芋おいたす。 お楜しみに。



䞖界は静止しおいたせん。 ナヌザヌはたすたす欲し始め、ブラりザは倉化し、りェブは倉化しおいたす。 これは正垞です。 私たちは、食料品の機胜を䜜るだけでなく、コンテンツの消費に関しお最高の䜓隓を埗るためにあらゆる方法でナヌザヌを支揎するこずも詊みおいたす。 そしお、䞀般的なブラりザでの倉曎に垞に備える必芁がありたす。 圓然、問題がある堎合-来お、私たちはお互いに話し合い、助け合う準備ができおいたす。



ここで、さたざたな䟿利なリンクを集めたした。






All Articles