フロント゚ンドのパフォヌマンスの最適化

ブレヌキサむトは、ナヌザヌだけでなく開発者にずっおも苊痛です。 状況を修正する方法、キャッシュに䟝存する必芁がある堎合、プロセッサを信頌できる堎所、およびこれらすべおが耇雑なフロント゚ンドアプリケヌションのパフォヌマンスを最適化するのに圹立぀方法、JS゚キスパヌトでありHTMLアカデミヌの教垫であるIgor Alekseenko@ iamo0が実際に説明する準備ができおいたす。 Frontend Conf 2017での圌のレポヌトのカットデコヌディング䞭。




スピヌカヌに぀いお
Igor Alekseenkoは、HTMLアカデミヌで基本および高床なJSコヌスを提䟛する長幎の開発者です。 圌は、Lebedev Studio、Islet、JetBrainsで働いおいたした。

今日、私は開発者の問題に぀いお話したかった。 私自身の痛みを分かち合いたすが、あなたがそれを分かち合うこずを願っおいたす。



むンタヌフェむスが遅くなるず嫌いです。 そしお、私はサむトのナヌザヌずしおだけでなく、開発者ずしおも嫌いです。



なんで 開発者ずしお、私たちは、人々がサむトで経隓する感情、その経隓に察しお責任があるからです。 人がサむトに来お、ある皮の吊定的な経隓を埗た堎合-これは私たちのせいです。 これはデザむナヌではなく、掗緎された技術ではありたせん-これが私たちです。



さお、むンタヌフェむスが遅くなるだけです。 たあ、ナヌザヌは私たちのオンラむンゲヌムに来たすが、敵を狙っお殺したり、ぎくぎくしたアニメヌションを芋たりするこずはできたせん。



しかし、実際には、すべおがはるかに耇雑です。 より倚くのサむトがあり、より耇雑な問題を解決するからです。 銀行業務アプリケヌションを開発しおいお、デヌタを再送信し、ナヌザヌがお金を倱った堎合、たたはオンラむンストアを所有しおおり、ナヌザヌが必芁な補品を賌入できなかった堎合、このナヌザヌは倱われたす。 そしお、これはすべおあなたのサむトが遅いずいう事実によるものです。

ナヌザヌの損倱ずは、お金の損倱、䌚瀟の芳点からの収益の損倱、そしお堎合によっおは解雇です。

したがっお、䞀般的に、スロヌダりンサむトは深刻な問題です。 それで察凊する必芁がありたす。
しかし、問題を解決するには、敵を盎接知る必芁がありたす。 サむトにブレヌキがどのようなものがあるのか​​、なぜサむトが遅いのか、どこからブレヌキが発生するのかを芋おみたしょう。



サむトでのブレヌキは、ナヌザヌの操䜜が均等でなくなるず発生したす。 これはどういう意味ですか 実際、ナヌザヌがサむトを閲芧するず、ある皮の静止画像以䞊のものが衚瀺されたす。 このサむトは単なる写真ではないため、ナヌザヌが提䟛するむンタヌフェむスずナヌザヌがやり取りするプロセスです。



ナヌザヌは、私が話したのず同じアニメヌションを芋るこずができたす。 サむトを簡単にスクロヌルできたす-これも動的な盞互䜜甚です。 圌はボタンを぀぀いたり、テキストを入力したり、アむテムをドラッグしたりしたす。 すべお動的に機胜したす。



なぜ動的に機胜するのですか なぜサむトは長期間存続できるのですか
これは、むベントルヌプなどの蚭蚈がすべおのブラりザヌ゚ンゞンに組み蟌たれおいるためです。



実際、むベントルヌプは非垞に単玔なプログラミング手法であり、特定の呚波数で無限ルヌプを開始するだけです。 スタックにずらわれず、䜕らかのパフォヌマンスが埗られるようにしたす。

すべおのステップでこの無限ルヌプは倖郚条件をチェックし、特定のアクションを開始したす。 たずえば、ナヌザヌがマりスをスクロヌルし、ペヌゞをわずかに移動する必芁があるこずを理解しおいたす。



ブラりザ゚ンゞンに組み蟌たれおいるむベントルヌプを䜿甚するず、スクロヌル、その他の凊理、長期的に実行するコヌドなど、すべおのナヌザヌむンタラクションが同期されたす。 ぀たり、すべおこのむベントルヌプに䟝存したす。

むベントルヌプフレヌムに入る方法は

特定の呚波数で回転するサむクルがありたす。 しかし、私たちは、フロント゚ンドの入札者ずしお、この頻床を制埡できず、それを知りたせん。 私たちは、すでに準備された、私たちの埓業員を察象ずしたものを䜿甚する機䌚しかありたせん。 ぀たり、呚波数を制埡したせんが、それに適合させるこずができたす。 これにはrequestAnimationFrameコンストラクトがありたす。

コヌドをコヌルバックrequestAnimationFrameに枡すず、次の曎新フレヌムの先頭に到達したす。 曎新フレヌムは異なりたす。 たずえば、MACでは、これらのフレヌムは60 Fに収たろうずしたすが、呚波数は垞に60 Fに等しいずは限りたせん。 䟋でさらに説明したす。



Javascriptは、時間の経過ずずもに曎新される無限ルヌプに基づいおいるこずがすでにわかっおいたす。 これで、ブレヌキがどこから来るかを掚枬できたす。

時間の経過ずずもに曎新されるフレヌムがありたす。 サむトでいく぀かの蚈算を実行したす。 どれでも。 Javascriptで蚘述しおいるのは、実際にはコンピュヌティングだけです。 これらの蚈算に衚瀺される1぀の曎新フレヌムよりも時間がかかる堎合、ナヌザヌには遅れが衚瀺されたす。



぀たり、䞀連の連続したフレヌムがあり、1぀のフレヌム以䞊を芁する長い蚈算がありたす。 ナヌザヌにはわずかな遅延が芋られたす。 圌はアニメヌションをぎくぎくさせたす。



たたは、蚈算が倧きくなりすぎお、ペヌゞがフリヌズし、䜕もできなくなりたす。

わかりたした。ブレヌキずは䜕か、なぜサむトが遅くなるのかを理解したした。 それでは問題を解決したしょう。



私たちはプログラマヌなので、コヌドを実行するツヌルがありたす。 プログラマの䞻なタスクは、プロセッサずメモリの間の負荷分散を正しく分散するこずです。
私たちは皆、プロセッサヌずは䜕かを知っおいたす。 これは、むンスタントコンピュヌティングを担圓するコンピュヌタヌ内のデバむスです。 ぀たり、蚘述するコマンドはすべお、プロセッサの呜什に倉換され、このコマンドが実行されたす。

しかし、䜕らかの玠晎らしい結果をもたらす䞀連のコマンドがある堎合たずえば、耇雑な倀を蚈算した堎合、このシヌケンスを繰り返したくない堎合は、このコマンドの結果をメモリに曞き蟌み、メモリ読み取りず呌ばれる別のプロセッサ呜什を䜿甚できたす。

私はこれに぀いお話したいだけです。



論理的ず思われる最初の最適化は、蚈算を䜿甚しないためにメモリを䜿甚するこずです。

原則ずしお、このような戊略は有利に聞こえたす。 さらに、これは優れた戊略であり、すでに䜿甚されおいたす。



たずえば、Javascriptには、数孊ずコンピュヌティングで動䜜するように蚭蚈された組み蟌みのMathオブゞェクトがありたす。 このオブゞェクトには、メ゜ッドだけでなく、蚈算された䞀般的な倀も含たれおいるため、再カりントされたせん。 たずえば、特定の文字たで保存されおいる数倀πの堎合のように。

第二に、昔の良い䟋がありたす。 80幎代のプログラマヌは、効果的な゜リュヌションを曞いたので本圓に倧奜きです。 鉄は匱く、圌らはいく぀かの良いものを考え出さなければなりたせんでした。

3Dシュヌティングゲヌムでは、垞に䞉角法が䜿甚されたす。距離ずサむン、コサむン、その他の類䌌のものをカりントするためです。 コンピュヌタヌの芳点から芋るず、これらは非垞に高䟡な操䜜でもありたす。

以前は、コンパむル段階のプログラマは、サむンずコサむンのテヌブルをプログラムコヌドに盎接挿入しおいたした。 ぀たり、圌らは䞉角関数のすでに蚈算された倀を䜿甚したした。 シヌンをレンダリングするためにそれらをカりントする代わりに、それらを定数ずしお取りたした。
このようにしお、䞖界䞭のすべおを最適化できたす。 アニメヌションを事前に蚈算しお、どのように芋えるか、䜕でもできたす。

原則ずしお、非垞にクヌルに聞こえたす。



ここにフレヌムがありたす。いく぀かのフレヌムを䜿甚する蚈算を開始する代わりに、読み取りのみの蚈算を実行したす。完成した倀を読み取り、眮換し、䜿甚したす。 そしお、むンタヌフェヌスは非垞に高速であるこずがわかりたした。
理論的には、これは非垞にクヌルに聞こえたす。 しかし、フロント゚ンドがメモリでどのように機胜するかを正確に考えおみたしょう。



ブラりザのタブを開くず、特定の量のメモリが割り圓おられたす。 ずころで、私たちも圌を知りたせん。 これには制限もありたす。

しかし、それだけでなく、この蚘憶を制埡するこずもできたせん。

別の特性がありたす-䜕かがこのメモリに既に保存されおいたす

  1. このメモリには、蚀語のランタむムすべおのコンストラクタヌ、すべおの関数が栌玍されたす。 蚀語自䜓はメモリに保存されたす。
  2. たた、いく぀かのデヌタを䜿甚したす。Ajaxから䜕かをダりンロヌドし、いく぀かの構造を生成したす。
  3. DOMツリヌがあり、JavascriptがHTMLを読み取るこずができず、ブラりザヌがそのマヌクアップをオブゞェクトのセットに倉換しおツリヌに倉換するため、メモリも取埗したす。 ブラりザのメモリ内で、タブは、個々のオブゞェクトの圢匏のすべおのタグを含む、マヌクアップにあるすべおのものを取埗したす。 テキストが入りたす。

぀たり、タグの間にある転送ごずに、ブラりザヌメモリオブゞェクトがテキストモヌドずしお䜜成され、ハングしたす。
私たちはすでに倚くのすべおを蚘憶に持っおいるこずがわかりたすが、同時に私たちはそこに自分自身の䜕かを曞きたいず思っおいたす。 メモリが遅くなり始める可胜性があるため、これは非垞に危険です。



䞻に2぀の理由がありたす-そしお、奇劙なこずに、それらは互いに矛盟しおいたす。 1぀目はガベヌゞコレクションず呌ばれ、2぀目はガベヌゞコレクションの欠劂です。



それぞれを分析したす。

ガベヌゞコレクションずは䜕かを説明する前に、パフォヌマンス、メモリ、その他すべおの点で䜜業をどのように芋おいるかを説明したす。



事実は、これらすべおが枬定できるずいうこずです。 どのブラりザにも開発者ツヌルがありたす。 Chromeの䟋を瀺したすが、他のブラりザヌでも衚瀺されたす。 「プロファむリング」たたは「パフォヌマンス」タブを確認したす。

い぀でも開いお、いわゆるブラりザパフォヌマンススナップショットを枬定できたす。 「蚘録/蚘録」ボタンをクリックしたす。 パフォヌマンスの蚘録が䜜成され、しばらくするず、ペヌゞで䜕が起こっおいたのか、メモリずプロセッサにどのように圱響したのかを確認できたす。

このタブは䜕で構成されおいたすか


そのため、Instagramでこのパフォヌマンスをシヌルで枬定したす。 誰もが猫を愛し、誰もがInstagramを愛しおいるので、私はそうするこずにしたした。



猫はあたりいないので、倧きなペヌゞを芋おいきたす。 5ペヌゞに5,000個のシヌルがあり、それらを切り替える方法を孊習したす。

以䞋は、シヌルを生成するコヌドです。 それらはすべおナニヌクです。



぀たり、暙準テンプレヌトからDOM芁玠を䜜成し、䞀意のデヌタを入力したす。 写真が繰り返される堎合でも、テンプレヌトを䜿甚したす。これにより、キャッシュがなくなり、メモリテストがクリヌンになりたす。



すべおの芁玠を䜜成したら、それらを1぀のフラグメントに远加したす。これは、皆さんが知っおいる最適化でもありたす。 ペヌゞをきれいにするために、チェッカヌをむき出しにしたす -コンテナを枅掃したす。



より速く動䜜したす。

ガベヌゞコレクション。



ガベヌゞコレクションは、メモリ凊理を最適化するために蚭蚈されたプロセスです。 圌は私たちによっお制埡されおいたせん。 ブラりザ自䜓は、このタブに割り圓おられたメモリが䞍足しおおり、叀い未䜿甚オブゞェクトを削陀する必芁があるこずを認識するず、ブラりザを起動したす。

叀い未䜿甚オブゞェクトは、参照されなくなったオブゞェクトです。 ぀たり、これらは倉数、オブゞェクト、配列に曞き蟌たれないオブゞェクトであり、䞀般にどこにも曞き蟌たれたせん。

確かに、これはクヌルなプロセスのようです。メモリは本圓に制限されおおり、解攟する必芁があるため、ガベヌゞコレクションが必芁です。

なぜこれが問題になるのでしょうか ガベヌゞコレクションにかかる時間はわからないし、い぀発生するかわからないからです。

䟋を芋おみたしょう。



ここでは、猫のペヌゞを切り替えるためのタむムラむンプロファむルを蚘録したした。 䞊のグラフは、プロセッサのパフォヌマンスの急䞊昇-CPU䜿甚率を瀺しおいたす。

䞋のグラフは、最初にメモリが増加するこずを瀺しおいたすこれはメモリ䜿甚量のグラフです。 これは単なるガベヌゞコレクションプロセスです。

最初の2ペヌゞに十分なメモリがあり、10,000個のシヌルを描きたした。 その埌、メモリがなくなり、さらに5,000個のシヌルを描画するために、叀いシヌルは䜿甚されなくなったため削陀したした。

原則ずしお、これはクヌルです。 確かに、ブラりザは私を䞖話し、私が䜿甚しおいないものを削陀したした。 問題は䜕ですか



私がい぀も蚀うように、このゞャンプダりンを芋お、ガベヌゞコレクションプロセスにかかった時間を芋おみたしょう。

4぀のガヌバヌゞ収集゚ントリを远加するず、ガベヌゞコレクションプロセスに134ミリ秒かかったこずがわかりたす。これは60 Fpsで10フレヌムです。



぀たり、600 Psのブロック移動を䞀定時間アニメヌション化する堎合、ブラりザがメモリを消去するこずを決定しただけで、100 Psの移動を倱うこずになりたす。 このプロセスの開始も期間も制埡したせん。 これは悪いです。

メモリリヌクは、ガベヌゞコレクションが䜿甚できるず考えおいるため、ガベヌゞコレクション時に䞀郚の未䜿甚のオブゞェクトがメモリに残る状況です。

2番目の問題は、最初の問題ずは正反察です。 これはメモリリヌクず呌ばれたす。

ブラりザは非垞に矛盟しおいるように芋えたす。メモリを消去する必芁がありたす-長い時間がかかり、メモリを消去しない-時間がかかりたす。 なんで

メモリリヌクは、ガベヌゞコレクションがない堎合のこのようなプロセスです。 ぀たり、それが起こっおいるかもしれたせんが、必芁なものをきれいにしたせん。 時々私たちはそのようなものを投げるこずができたす-そしおそれを芋るず、ブラりザ゚ンゞンはそれをきれいにできないこずを理解したす。

コヌド䟋を芋おみたしょう。



ここでも同じペヌゞ切り替えがありたすが、ペヌゞに新しい芁玠を挿入するたびに、各写真にハンドラヌを远加したす。

スペヌスバヌを抌す必芁があるずしたしょう。 念のため、Keydoが消えないようにドキュメントにハンドラヌを配眮したした。 この堎合はどうなりたすか

HTML削陀を䜿甚しおコンテナをクリヌニングするず、DOMノヌドがDOMツリヌから削陀されたす。 ただし、ドキュメントはペヌゞに残るため、ドキュメントのハンドラは残りたす。 圌には䜕も起こりたせん。 ガベヌゞコレクションが発生するず、ガベヌゞコレクタヌはこれらのハンドラヌを削陀したせん。
これらのハンドラヌの䞭に䜕が曞かれおいるのか芋おみたしょう。

これらのハンドラヌ内でノヌドが䜿甚されたす。 ノヌドぞのリンクがあるため、ノヌドはメモリから削陀されないこずがわかりたす。 これはメモリリヌクず呌ばれたす。 ロゞックの芳点からは、ペり玠やハンドラヌは必芁ありたせん。 しかし、圌の芳点からはコレクタヌが䜿甚されおいるため、コレクタヌはそれに぀いお知りたせん。

この堎合はどうなりたすか チャヌトを芋おみたしょう。



䞊昇ず䞋降の波から、スケゞュヌルは成長する梯子に倉わりたした。 ペヌゞを切り替えるたびに、メモリはたすたす䜿甚されたすが、メモリ内にはハンドラずノヌドがあるため、クリヌンアップされたせん。

メモリは解攟されたせん。 コンピュヌタヌの速床も䜎䞋し始めたす。

なんで 倧きなメモリは非垞に悪いからです。 プロセッサは、倧きなDOMで操䜜を実行䞭に詰たりたす。

その結果、メモリの助けを借りお䜕かを最適化しようずするず、倧きなリスクが生じるこずがわかりたした。



Javascriptを䜜成したBrendan Ike自身は、最近のむンタビュヌWebAssemblyで次のように述べおいたす。 それは高速で、時にはパフォヌマンスでCず競合できたすが、問題はガベヌゞコレクションが発生したずきに始たりたす。これは、コレクタヌがい぀来るか、どのくらいの期間動䜜するかわからないためです。」

信頌できないメモリ
メモリに関連付けられおいるブレヌキは、倀が曞き蟌たれたり、自動的に消去されたりするずきに発生する可胜性がありたす。 ブレヌキがい぀発生するかを予枬するのは非垞に難しい

メモリの最適化-おそらく良いもの-は信頌性が䜎いこずが刀明したした。パフォヌマンスが䜎䞋し、すべおがうたくいかない堎合があるためです。



したがっお、図の反察偎を芋おみたしょう。これは、メむンのコンピュヌティングデバむスであるプロセッサの芳点からアプリケヌション速床を最適化する方法を瀺したした。



プロセッサを高速化するには、䞻に3぀の方法がありたす。

  1. 蚈算量を枛らしたす。
  2. 速歩-少し埌で、それが䜕であるかを説明したす。
  3. プロセッサを䜿甚しないでください。 これもかなり奇劙ですが、プロセッサを最適化する良い方法です。



猫ず䞀緒に写真を芋おみたしょう。



私は、5枚のペヌゞにそれぞれ5,000のシヌルを描いおいるず蚀いたした。 原則ずしお、これは実際のボリュヌムです。 これらのシヌルを0.5分間スクロヌルするず、5,000芁玠のDOMを取埗できたす。

しかし、あなたがそれに぀いお考える堎合-これは最初の起動には必芁ありたせん。 珟圚、4行5列のシヌルが衚瀺されおいたす。 これは20シヌルです。 ナヌザヌがペヌゞを初めお開くず、5,000枚の写真すべおではなく、20のシヌルが衚瀺されたす。

そしお、ブラりザヌは5,000を描画したす。 20を衚瀺する堎合、なぜ5,000のシヌルを描画するのですか

たあ、私たちは予備を䜜るこずさえできたす-ナヌザヌはサむトをスクロヌルできたす、そしお、圌は䜕かを瀺す必芁もありたす。 ただし、100匹の猫を描いた堎合、すでに5぀の画面になりたす。



したがっお、最初にできるこずは、DOMのボリュヌムを枛らすこずです。 これが最も簡単な方法です。 DOMを削枛するず、すべおが高速に機胜したす。

プロファむラヌの芳点からあなたにそれを蚌明させおください。



最初のペヌゞに5,000個の芁玠を描画し、プロファむラヌを䜿甚しお読み蟌みプロセスを蚘録したす。 ちなみに、「再読み蟌み」ボタンがあり、クリックするず、プロファむラヌはペヌゞの読み蟌み速床を蚘録したす。 圌はそれをリロヌドし、ペヌゞが完党にレンダリングされ、すべおの準備が敎ったら、このスクリヌンショットの蚘録を停止し、4秒で5,000のシヌルを描画したす。

そしお、ここでスクリヌンショットを蚘録したした。 . , - , .



100 ( ), 0,5 . — .

.

– .



?

, , . .

– , , , ?



, 60 Fps, . 16,5 . – 16,5 ? , .

. 5 000 , 100. . , .



. , , . .

. – , . , 1 000 ps . 500 .



? 60 Fps – . LG Ipad 120 , , 120 Fps, 60. . , « ? ?» – . .

, . 4 ps . , , 1 100 .

, .



, , . ? , , – , .

100 , 20-30 ps, 100 . – 100 ps , .

. . , 60 Fps .

– .



? いく぀かのオプションがありたす

  1. .
  2. ;
  3. . — , .

.



, SVG, anvas.

– , disposable , . , . , , anvas.

SVG anvas.



SVG, - , DOM-. SVG – DOM. , , , JS DOM- – , , - .

anvas, . , anvas. — .
anvas — DOM-, - . - , , SVG.

SVG - — API. SVG - , , , .

anvas . , . . SVG – DOM, , — .

, .



– 800600 – . , , – . path. . .

requestAnimationFrame . , Fps . , 1 .

360° – . – 0, .



anvas. -, . GPU. . .

Main. 0 360 – .

.

, , . – 360° 60 — 60 Fps – .



SVG . なんで , Raster. , SVG DOM-, , GPU, .

DOM-, , . . , 45 Fps.

45 Fps , , , . : « ? , 24 Fps».

違いたす。 , 24 Fps, 48 Fps. : «, 24 Fps, ».



, . , 48 Fps.

.

48 Fps. SVG , , .

, anvas SVG. , disposable , , anvas.

.



, – . . , , , .



anvas anvas, 60 Fps. , . 60 Fps – anvas.

, SVG?



24 ! , . . , . .

, , SVG.



, , . , 24 , , -.

, disposable-, , anvas. - , , , DOM-, -.

, canvas.



– . , anvas . - : .



: ? . SVG , – 1ps, - . anvas.



anvas. , , , .

? , :

  1. . Canvas – , API .
  2. , . — .

: «, , – , , :

, , , , . , .

, – . – .



– . , , .

. , , Ace. , , , .

, , : «, » — .

, , ST-, , .

Ace? : « . , . . . Worker».

, Javascript- — , .
. Worker DOM'. DOM' , . .



たずめるず。 ?


蚈算を最適化および削枛する方法に぀いお長い間話したした。しかし、時にはこれを行うこずができたせん。

たずえば、むンタヌネット䞊の実サヌバヌは、100ミリ秒よりも速く応答したせん。私はそれに぀いお䜕もできたせん。たずえ现郚たで考え抜かれた非垞に矎しいむンタヌフェむスを䜿甚しおいおも、すべおの蚈算が最適化され、遅延が発生し、ナヌザヌは遅れを芋るこずができたす。

遅延をどうするか2぀の方法がありたす。

  1. 透過的なフィヌドバックを䜿甚したす。぀たり、「はい、遅延があるこずはわかっおいたすが、これは正垞です」ずいうこずをナヌザヌに瀺したす。
  2. ナヌザヌを少しだたす。

次に、その方法を説明したす。



正しいフィヌドバックを怜蚎しおください。 Instagramに戻っお印を抌しお、少しやり取りしたしょう。



猫がいお、ナヌザヌはそれを奜きになりたいです。 圌はマりスを持っおきお、アスタリスクをクリックしたす-はい、あなたは奜きです、あなたは完了です もっずいいね しかし、これは真実ではありたせん。 Likeは奜きではありたせんが、サヌバヌ䞊では奜きではありたせん。

サヌバヌには時々これがありたす



この堎合、すべおの開発者は䜕をしたすか



誰も透明なフィヌドバックを行いたせん。

どうやっおやるの Optimistic UIを忘れる必芁があるず蚀っおいるわけではありたせんが、方向性を瀺しおいたす。 ナヌザヌが䜕かをクリックしたが、結果がすぐに衚瀺されない堎合は、衚瀺する必芁がありたす。たずえば、このアスタリスクを匷調衚瀺するこずもできたす。 少なくずも衚瀺「埅っお。 はい、私たちはあなたが抌したものを理解したしたが、すべおがただ準備ができおいるわけではありたせん。」

䜕かがうたくいかないずきは、別のステヌタスも必芁です。 ぀たり、透明性を保ち、䜕が起きおいるのかをナヌザヌに瀺す必芁がありたす。 先ほど蚀ったように、私たちはサむトのナヌザヌの印象に責任がありたす。 そしお、圌は愚か者ではなかった、圌は䜕が圌をコン゜ヌルに連れおきたかを理解しおいなかった。



この報告曞の準備をしおいるずきに、母に電話をしお、䜕を話したいか話したした。 圌女は私に冗談を蚀った

-どうしお10個のピザを持っおきたの 私は1を泚文したした。
-はい、1を泚文したしたが、ボタンを10回抌したした

銬鹿げた冗談のように思えたすが、私はこれに出くわしたした。 時々私はコメントを曞いおボタンをクリックしたす-そしお、ボタンが曲がらなくおも䜕も起こりたせん。 私は思う-それはバギヌ、たたは䜕ですか もう䞀床クリックする必芁がありたす。



しかし実際には、すべおが起こり、リク゚ストはサヌバヌに送られ䞡方のリク゚ストはサヌバヌに送られたした、䞡方のコメントがレンダリングされたした。 たた、2぀の同䞀のコメントが衚瀺された堎合、ナヌザヌはそれを奜みたせん。
なんらかの理由で、プログラマヌが実際に責任を負うのに、私は責任があるず信じられおいたす。 フィヌドバックを衚瀺するだけです。はい、このボタンをもう䞀床クリックしないでください。 クリックされたこずがわかりたした。

答えが来たら、コンテンツをリセットするこずもできたす。ナヌザヌは別のメッセヌゞを入力できるこずを盎感的に理解できたす。



開発段階では、コストは䞀切かかりたせんが、むンタヌフェヌスは改善され、遅延はより透過的になりたす。 ナヌザヌは気分を害するこずはありたせん。 圌はあなたがサヌバヌに行く必芁があるこずを知っおいたす。 ルむXケむが蚀ったように「埅っお それは宇宙に飛び蟌みたす」ずあなたは私のサむトがすぐに衚瀺されないず文句を蚀いたすが。



2番目の方法-ナヌザヌを少しだたすこずができたす。

たずえば、1982幎たたは1987幎にMacintoshを開発した人たちは、Appleがコンピュヌタを手頃な䟡栌にするために䞀定の䟡栌に収たるタスクを持っおいたため、ハヌドりェアが非垞に匱かったのは確かではありたせん。 そしお、圌らは興味深い゜リュヌションを考え出さなければなりたせんでした。



Mac OSむンタヌフェヌスの最初のバヌゞョンを蚭蚈したゞェフラスキンは、次のこずを思い぀きたした。 コンピュヌタヌがすぐにオンにならず、䜜業画面をすぐに衚瀺できないこずは明らかです。 そのため、画面をオフにする前の最埌の状態の写真を撮圱し、ディスクのれロトラックに写真を蚘録し、オンにするず画面を衚瀺したした。

なぜ機胜したのですか 人がコンテキストを切り替えるのに数秒かかるからです。 ぀たり、FPSに぀いお話すずき、プロのパむロットは270 Fpsを参照したす。 しかし、人々がタスク間でコンテキストを切り替えるず、䜕が起こっおいるかを理解するのに数秒かかりたす。

Mac OSのメンバヌが写真を芋せたずき、人々は芋お、「ここで䜕かが起こり、䜕かが倉わった」ず考えたした。 䜕が起こったかを理解しおいる限り、実際の画面が衚瀺されたす。
この゜リュヌションは非垞に優れおいるため、Macでも動䜜したす。 たずえば、macbookの電源を入れるず、WI-FIむンゞケヌタヌが既に完党にオンになっおいるこずがわかりたす。 そしお2秒埌、圌はネットワヌクの怜玢を開始したす。



最初の方法に続く2番目の方法は、トリミングされたスクリヌンショットです。 スケルトンスクリヌンず呌ばれたす。 このこずは、Google Imagesによっお発明されたした。

少し前に説明したのず同じタスクがありたした。すべおの写真を衚瀺しないず、ナヌザヌがスクロヌルしたす。

圌らは考えたした-䞀床にすべおの写真を衚瀺するこずはできたせんが、写真があるこずをナヌザヌに玄束するこずはできたす。 そしお、圌らは絵の倧きさの灰色のブロックを描きたした。 ナヌザヌが停止するず、実際の写真が衚瀺されたす。 ナヌザヌがスクロヌルしお灰色のブロックを芋たずき、圌はこれを盎感的に信じおいたす-たあ、はい、画像はロヌドできたせんでした、これは正垞です。

䜿甚するこずもできたす。それは良いこずです。



たずめるず。 サむトが遅い堎合はどうすればよいですか





このトピックの詳现が必芁な堎合は、聎衆からの質問に察するスピヌカヌの回答のトランスクリプトを甚意したした。

ネタバレの䞋のすべお
-ワヌカヌは、デヌタが送信されるずシリアル化/非シリアル化されるようです。 耇雑な蚈算でこの状況が発生したした。 グラフ䞊のポむント数、サヌバヌからのポむント数をカりントし、すべお完了したした。 すべおをWorkerに移動するず、速床がさらに䜎䞋したした。 同時に、このロゞックをすべおサヌバヌに持ち蟌むこずはできたせん-それも鈍化し始めおいるからです。

その結果、ペヌゞをロヌドするずきに小さな遅延がありたす。 装食したしたが、ずにかくそこにありたす。 そのような状況に察凊する方法は 䜕を提案したすか

-最初に頭に浮かぶのは、今は正垞であるず考えられおいるこずをスピナヌに瀺す方法です。 第二に、タスクは䞀般的な方法で定匏化されおおり、具䜓的な゜リュヌションを提䟛するこずはできたせんが、サヌバヌから送信されるデヌタを正確に調べたす。 倚すぎるかもしれたせん。

-いく぀かのデヌタを含む1000ポむント。

-デヌタを間匕くこずは理にかなっおいるかもしれたせんが、可胜な限りそれらを少なく衚瀺しおください。

「いく぀かの叀い回顧展を陀いお、間匕き。」 オプション、ずころで、ありがずう。

-はい、最初にダりンロヌドするデヌタの量を枛らしおから、必芁に応じおより倚くのデヌタをロヌドするず、少し速く動䜜したす。

-スクロヌルずTimeOutの枛算に関する䟋がありたしたが、私の意芋では100でした。 Windows TimeOutおよびClearを䜿甚するず、゜リュヌションは悪化したすか ぀たり、最埌に1回チェックしたす。

-これは、trotlがWindows TimeOutであるずいう䞀般的な誀解です。 誰がそれを思い぀いたのか芚えおいない-倧物の䞀人はザカだそうだ。 これは実際にはデバりンスであり、わずかに異なる操䜜です。 スロットルずは、蚈算が頻繁に発生する堎合であり、それらの䞀郚のみを取埗したすが、その期間は同じです。 ぀たり、スロットルは、100ミリ秒ごずに保蚌された䜕かが行われたずきです。 たた、TimeOutを䜿甚した䟋は、100ミリ秒ごずに機胜したせん。 スタックがいっぱいになり、100ミリ秒が経過するず実行されたす。

これは良いこずです。 これはデバりンスず呌ばれたす。 たた、たずえば、ナヌザヌが䜕かを入力したずきに、入力時に件名を䜿甚しお衚瀺するためにスロットルを䜿甚する必芁はありたせん。入力したずきにこのデバりンスを実行する方がよいでしょう。

-プロセッサの最適化に関する䜕かを明確にしたいず思いたす。 成局に぀いおは䜕も蚀われおいたせん。 しかし、これにより、アニメヌションの時間を節玄し、グラフィックプロセッサに蚈算を転送するこずができたす-異なる堎所で異なる時点で描画する必芁がある画像を正確に転送できたす。

-倉曎はどういう意味ですか はい、同意したす。 コヌドに぀いおお話ししたいだけです。Will-changeは宣蚀型APIであり、マヌクアップではHTMLを指したす。

-いずれにしおも、最適化。 プロセッサに関する2番目の質問。 サヌビスワヌカヌがサポヌトされおいない貧しいブラりザナヌザヌはどうですか アプリケヌションでヘビヌりェむト蚈算を転送するずいう事実に瞛られおいない堎合、サポヌトが倧幅に制限されたす。

-私は今でもタスクの優先順䜍付けなどが本圓に奜きです。 たずえば、React Fiberはこれを䜿甚したす。

必芁なむンタヌフェむスを曎新するためのすべおのタスクを収集し、優先床の順に実行したす-最初はレンダリングの芳点から重芁ですが、そうではありたせん。 たた、サヌビスワヌカヌがいないにもかかわらず、䜕らかの方法ですべおを分散する必芁がある堎合は、タスクのプヌルを収集しお、優先床に応じお同じ方法で実行できたす。

React Fiberはボンネットの䞋でそれを行いたす、それはクヌルです。

-私が理解しおいるように、それはおおよそのレンダリングの粟神に沿ったもので、最初は粗く、次に詳现です。

-これは非垞に単玔な単玔化ですが、そのようなものです。

-DOM SVGアニメヌションに぀いお質問がありたす。 たずえば、lstgs subを䜿甚したこずがありたすか、テストを実行したこずがありたすか これは、DOMのアニメヌションパフォヌマンスを向䞊させるこずを目的ずしたプロゞェクトです。

-いいえ、私はすべおハヌドコア、鉄を芋せたした。 アニメヌションはすべお手曞きです。

-そのようなテストを芋るのは面癜いでしょう。

-ツヌルの面では これは良い考えです、私はそれに぀いお考えたす。 私はすでにりェブサむトを持っおいるず蚀っおいたしたが、倚分それを時間をかけお詊しおみるでしょう。

-圌らはただ、ラグなしで倚くのノヌドをすぐにアニメヌション化でき、テストがあるず蚀っおいたす。 面癜い。

-私はあなたに同意したす、しかし、あなたが芋るのは、ボンネットの䞋に私がちょうど蚀ったのず同じこずがあるからです。 移動する方向を理解する必芁がありたす。 これらのラむブラリがこれを䜿甚しおいるこずを理解しおいるなら、それは良いこずであり、助けになりたす。 同意したすか

たた、 Frontend Conf 2017のパフォヌマンスのすべおのビデオ録画ぞのアクセスを公開したこずをお知らせしたす。 それらのほが䞉ダヌスがありたす。

同時に、5月のRIT ++カンファレンスのフェスティバルでスピヌカヌになるようプロを招埅したす。 興味深い開発経隓があり、それを共有する準備ができおいる堎合は、プログラム委員䌚に䟝頌しおください。

Source: https://habr.com/ru/post/J345498/


All Articles