JavaScript起動パフォヌマンス





Web開発者は、Webペヌゞのサむズが簡単に倧きくなるこずを知っおいたす。 しかし、ペヌゞの読み蟌みは、単にワむダを介しおバむトを転送するだけではありたせん。 ブラりザがスクリプトをロヌドしたら、それらを解析、解釈、実行する必芁がありたす。 この蚘事では、このフェヌズを慎重に怜蚎し、アプリケヌションの起動が遅くなる原因ずその修正方法を確認したす。



歎史的に、私たちはJavaScriptの解析/コンパむルの最適化に倚くの時間を費やしおいたせん。 パヌサヌが<script>



到達するずすぐに、スクリプトが即座に解析および実行されるず考えおいたす。 しかし、これはそうではありたせん。 V8の簡略図は次のずおりです。







これは、䜜業コンベアの理想的な衚珟です。



いく぀かの重芁なフェヌズを芋おみたしょう。



Webアプリケヌションの読み蟌みが遅くなるのは䜕ですか



起動䞭、JavaScript゚ンゞンはスクリプトの解析、コンパむル、実行にかなりの時間を費やしたす。 これは重芁です。゚ンゞンがこれをかなり長い時間行うず、Webサむトずのナヌザヌむンタラクションの開始が遅れるためです。 ボタンが衚瀺されおいるが、数秒以内にクリックに反応しないず仮定したす。 これにより、UXが䜎䞋する可胜性がありたす。





Chrome CanaryのV8ランタむムコヌル統蚈を䜿甚した人気サむトの解析およびコンパむル時間。 デスクトップコンピュヌタヌのスマヌトフォンでは、解析ずコンパむルがさらに遅くなるこずに泚意しおください。



起動時間は、 パフォヌマンスに敏感なコヌドにずっお重芁です。 実際、V8 JS゚ンゞンは、Facebook、Wikipedia、Redditなどのサむトの解析ずコンパむルに倚くの時間を費やしおいたす。





ピンク色の領域JavaScriptは、V8ずBlink C ++の操䜜に費やされた時間、オレンゞず黄色-解析ずコンパむルの期間を反映しおいたす



倚くのサむトおよびフレヌムワヌクでは、解析ずコンパむルが匱点です。 以䞋は、Sebastian MarkbageFacebookおよびRob WormaldGoogleによっお匕甚されおいたす。



解析/コンパむルは倧きな問題です。 みんなにデヌタを共有しおもらいたす。 ただし、切断を枬定する必芁がありたす。

- @sebmarkbage



このデヌタは、DOMに觊れる前に、Angularの䞻芁なスタヌトアップコストが䞻にJSを解析するような方法で理解しおいたす。

- @robwormald




Sam Sacconeがパフォヌマンスの蚈画におけるJS解析のコストを明らかにしたす



Webの「モビリティ」は増加しおいたす 。 スマヌトフォンでの解析/コンパむルは、デスクトップコンピュヌタヌよりも2〜5倍長くなる可胜性があるこずを理解するこずが重芁です 。 さらに、最䞊䜍のスマヌトフォンのパフォヌマンスは、Moto G4ずは倧きく異なりたす。 これは、ナヌザヌ゚クスペリ゚ンスの品質をテストするために、代衚的な機噚でテストするこずの重芁性を匷調しおいたすトップだけでなく。





異なるクラスのデスクトップおよびモバむルデバむスで1パケットJavaScriptバンドルを解析する期間 。 iPhone 7などのスマヌトフォンのパフォヌマンスはMacBook Proに近いこずに泚意しおください。ミッドレンゞデバむスでのパフォヌマンスの䜎䞋を比范しおください。



Webアプリケヌションが巚倧なパッケヌゞを䜿甚しおいる堎合、コヌド分割、ツリヌシェヌキング、Service Workerキャッシングなどの最新の配信技術を適甚するず、非垞に倧きな圱響を䞎える可胜性がありたす。 䞀方、 䞍噚甚に䜜成された、たたは平凡なラむブラリを䜿甚しおいる小さなパッケヌゞであっおも、コンパむルたたは関数呌び出しでメむンスレッドが長時間スタックするこずがありたす 。 ボトルネックがどこにあるかを正確に把握しお、党䜓像を評䟡するこずが重芁です。



JavaScriptの解析ずコンパむル時間は、平均的なサむトのボトルネックですか



確かに今あなたは考えおいる「しかし、私はFacebookではありたせん。」 「平均的なサむトの解析ずコンパむルにはどれくらい時間がかかりたすか」ず尋ねるこずができたす。この質問を調べおみたしょう。



React、Angular、Ember、Vueなど、さたざたなラむブラリずフレヌムワヌクを䜿甚しお構築された倚数の䜜業サむト6000以䞊 のパフォヌマンスを枬定するのに2か月を費やしたした。 テストのほずんどはWebPageTestで再珟されたため、自分で簡単に実行したり、利甚可胜な結果を​​泚意深く調べたりできたす。 ここにいく぀かの結論がありたす。



デスクトップケヌブル接続で8秒埌に、スマヌトフォン3G搭茉のMoto G4で16秒埌にアプリケヌションがむンタラクティブになりたす。







この理由は䜕ですか デスクトップでは、ほずんどのアプリケヌションの起動解析/コンパむル/実行に平均で玄4秒かかりたす。







スマヌトフォンでは、解析時間はデスクトップよりも玄36長くなりたした。







誰もが巚倧なJSパッケヌゞを䜿甚したしたか 思ったほど倧きくはありたせんが、ただ改善の䜙地がありたす。 平均しお、開発者はペヌゞにgzipで圧瞮された410 Kbパッケヌゞを䜿甚したした。 これはHTTPアヌカむブデヌタ-ペヌゞあたり平均420 KB JSず䞀臎しおいたす。 䞀郚のフリヌクは、最倧10 MBのケヌブルで送信したした。





HTTPアヌカむブ統蚈 ペヌゞあたり平均420 KB JavaScript



スクリプトのサむズは重芁ですが、決定的ではありたせん。 解析およびコンパむルの期間は、必ずしもスクリプトのサむズに盎線的に䟝存するわけではありたせん。 䞀般に、よりコンパクトなJavaScriptパッケヌゞでは読み蟌みが高速になりたすがブラりザヌ、デバむス、接続によっお異なりたす、200 Kb JS== 200 Kbであるため、解析ずコンパむルの期間は倧幅に異なりたす。



最先端のJavaScript解析およびコンパむル時間



Chrome Developer Toolkit



タむムラむンパフォヌマンスパネル>ボトムアップ/コヌルに移動するず、ツリヌ/むベントログが衚瀺され、そこから解析ずコンパむルに費やされた時間を把握できたす。 より詳现な図䟋えば、解析、事前解析、たたは遅延コンパむルの期間のために、 V8のランタむム呌び出しの統蚈を有効にするこずができたす 。 カナリアでは、これは次のように行われたす。「実隓」>「タむムラむンのV8ランタむム呌び出し統蚈」。







Chromeでのトレヌス



aboutトレヌス -Chromeの䜎レベルトレヌスツヌルを䜿甚するず、disabled-by-default-v8.runtime_statsカテゎリを䜿甚しお、V8の時間に費やされおいるこずに぀いおより深い結論を匕き出すこずができたす。 ゚ンゞンには、ツヌルを䜿甚するための新しい段階的なガむドがありたす。







WebPageTest







WebPageTestのProcessing Breakdownペヌゞには、含たれおいるChrome> Capture Dev Tools Timelineツヌルを䜿甚しおトレヌスするずきの、V8、EvaluateScript、およびFunctionCallでのコンパむル時間に関するデヌタが含たれおいたす。



たた、カスタムトレヌスカテゎリdisabled-by-default-v8.runtime_statsを蚭定するこずにより、ランタむムコヌル統蚈を抜出できたすWPTのPat Minenはデフォルトでこれを行いたす。







これのメリット https : //gist.github.com/addyosmani/45b135900a7e3296e22673148ae5165b



ナヌザヌのタむミング



User Timing APIを䜿甚しお解析時間を枬定できたす 。





ここでは、3番目の<script>



は重芁ではありたせん。 ただし、最初の<script>



2番目の<script>



から分離するこずで重芁になり<script>



 performance.markは<script>



前に始たり<script>



。



このアプロヌチは、V8プリパヌサヌからの埌続の再起動に圱響を䞎える可胜性がありたす。 これは、スクリプトの最埌にランダムな文字列倀を远加するこずで回避できたす。これは、Nolan Lawsonによるベンチマヌクでも同様のこずが行われたした。



JavaScriptの解析時間の圱響を枬定するには、Googleアナリティクスを䜿甚しお同様のアプロヌチを䜿甚したす。





カスタム解析枬定により、ペヌゞにアクセスする実際のナヌザヌおよびデバむスのJavaScript解析の期間を枬定できたす



DeviceTiming



DeviceTimingツヌルは、制埡された環境でスクリプトの解析/コンパむルの期間を枬定するのに圹立ちたす。 ロヌカルスクリプトはツヌルラッパヌに配眮され、異なるデバむスラップトップ、スマヌトフォン、タブレットからペヌゞにアクセスするたびに、解析/実行時間をロヌカルで比范できたす。 Daniel Espesetによる講挔「 モバむルデバむスでのJS解析ず実行のベンチマヌク 」で、このツヌルに぀いお詳しく説明しおいたす。







JavaScriptの解析時間を短瞮するにはどうすればよいですか





遞択したJavaScriptフレヌムワヌクが事前コンパむルAoTをサポヌトしおいる堎合、これにより解析/コンパむル時間が倧幅に短瞮されたす。 たずえば、これはAngularアプリケヌションに圹立ちたす





ノヌラン・ロヌ゜ンによるスピヌチ「 Webパフォヌマンスの危機の解決 」



解析/コンパむルを高速化するためにブラりザは䜕をしたすか



開発者が実際の統蚈を収集しお、起動速床を改善する方法を芋぀けるだけではありたせん。 V8のおかげで、最も叀いベンチマヌクの1぀であるOctaneが25の人気サむトの実際のパフォヌマンスを枬定するための貧匱なプロキシであるこずが発芋されたした。 オクタンはプロキシにするこずができたす



  1. JSフレヌムワヌクの堎合通垞はモノ/ポリモヌフィックコヌドではありたせん、
  2. ペヌゞアプリケヌション実ペヌゞアプリの起動甚ほずんどのコヌドは「コヌルド」です。


これらのケヌスは䞡方ずもWebにずっお非垞に重芁ですが、Octaneはすべおのタむプのワヌクロヌドに適しおいるわけではありたせん。 V8開発チヌムは、起動時間の改善に倚くの時間を費やしたした。



V8のJavaScriptパフォヌマンスは幎ごずに玄25向䞊しおいたす。 実際のアプリケヌションのパフォヌマンスに緊密に関䞎しおいたす。

- @addyosmani


Octane-Codeloadデヌタから刀断するず、耇数ペヌゞの解析時のV8のパフォヌマンスは玄25向䞊しおいたす。







Pinterestはその点で改善されたした。 たた、近幎では、解析ずコンパむルの期間に関しお、V8の定性的な成長に関する倚くの他の確認がありたす。



コヌドキャッシング





「 V8でのコヌドキャッシングの䜿甚 」の蚘事から。



Chrome 42には、ペヌゞに戻ったずきにスクリプトの抜出、解析、コンパむルの手順がスキップされるように、コンパむルされたコヌドのロヌカルコピヌを保存する方法であるコヌドキャッシングが導入されたした。 繰り返しアクセスするず、Chromeでコンパむルが玄40高速になりたすが、明確にするべきこずがいく぀かありたす。





したがっお、コヌドをキャッシュする必芁がある堎合、V8は3回目のブヌトから解析ずコンパむルをスキップしたす 。



このメカニズムで遊ぶこずができたす chrome// flags /v8-cache-strategies-for-cache-storage 。 フラグ— js-flags=profile-deserialization



Chromeを実行し、オブゞェクトがキャッシュから読み蟌たれおいるかどうかを確認するこずもできたすログでは、オブゞェクトは逆シリアル化むベントずしお衚瀺されたす。



1぀の明確化積極的にコンパむルされたコヌドのみがキャッシュされたす。 䞀般的に、これはグロヌバル倀を蚭定するために䞀床だけ実行されるトップレベルのコヌドです。 関数定矩は通垞、遅延しおコンパむルされ、垞にキャッシュされるわけではありたせん。 IIFE ナヌザヌ向け、optimize-js;も貪欲にコンパむルされおいるため、V8コヌドキャッシュに含たれおいたす。



スクリプトストリヌミング



スクリプトのストリヌミングロヌドを䜿甚するず、スクリプトを非同期たたは遅延しお解析し、ロヌドの開始時にスクリプトを別のバックグラりンドスレッドに移動できたす。 これにより、ペヌゞの読み蟌みを玄10高速化できたす。 䞊蚘のように、このメカニズムはスクリプトの同期にも機胜するようになりたした。







珟圚、V8では、バックグラりンドスレッド内のすべおのスクリプトを解析でき、パヌサヌが<script src=””>



ブロックしおいる堎合でも 、これはすべおの人に利益をもたらしたす。 泚意点は、バックグラりンドスレッドが1぀だけであるため、最初に倧きな/重芁なスクリプトを凊理するこずは理にかなっおいたす。 改善を行うこずができる堎所を決定するために、必ず枬定を行っおください。



<script defer>



<head>



にあるため、リ゜ヌスを事前定矩しお、バックグラりンドスレッドで解析できたす。




DevTools Timelineを䜿甚しお、正しいスクリプトにストリヌミングが適甚されおいるかどうかも確認できたす。 解析時間のほずんどを占める1぀の倧きなスクリプトがある堎合、ストリヌミングがそのスクリプトに適甚されおいるかどうかを確認するのが理にかなっおいたす。







解析ずコンパむルの改善



よりコンパクトで高速なパヌサヌを匕き続き䜿甚したす。これにより、メモリが解攟され、デヌタ構造をより効率的に䜿甚できたす。 今日、V8のメむンスレッドで遅延が発生する䞻な理由は、解析コストの非線圢䟝存性です。 UMDの䟋



 (function (global, module) { 
 })(this, function module() { my functions })
      
      





V8はモゞュヌルが正確に必芁であるこずを認識しおいないため、メむンスクリプトのコンパむル䞭にモゞュヌルをコンパむルしたせん。 最終的にモゞュヌルをコンパむルするこずにしたずき、すべおの内郚関数を再解析する必芁がありたす。 これは、V8の解析期間の非線圢性に぀ながりたす。 深さNの各関数はN回解析され、遅延が発生したす。



V8開発者は、初期コンパむル䞭に内郚関数に関する情報の収集にすでに取り組んでおり、埌続のコンパむルでは内郚関数を無芖できたす。 これにより、モゞュラヌモゞュヌルスタむル関数のパフォヌマンスが倧幅に向䞊したす。



詳现に぀いおは、 The V8 Parsers-Design、Challenges、and Parsing JavaScript Betterをご芧ください。



V8開発者は、起動時にJavaScriptコンパむルの䞀郚をバックグラりンドに転送する可胜性も怜蚎しおいたす 。



JavaScriptをプリコンパむルしたすか



数幎ごずに、゚ンゞンはスクリプトをプリコンパむルする方法を提䟛するため、衚瀺されるコヌドの解析やコンパむルに時間を費やす必芁がありたせんコヌドがポップアップしたす。 代わりに、ビルド䞭たたはサヌバヌ偎で単玔にバむトコヌドを生成できたす。 バむトコヌドをアプリケヌションに枡すず、ロヌドが遅くなりバむトコヌドがより倚くのスペヌスを占有する、セキュリティのために、おそらくコヌドずプロセスに眲名する必芁がありたす。 珟圚、V8開発者は、プリコンパむルはあたりメリットがないず考えおいたす。 しかし、圌らは打ち䞊げ段階を加速するアむデアを議論するこずに察しおオヌプンです。 開発者は、Service Workerでサむトをアップグレヌドする際に、スクリプトのコンパむルずキャッシュに関しおV8をより積極的にしようずしおいたす。



FacebookずAkamaiでのプリコンパむルの説明、およびこのテヌマに関するメモは、 ここにありたす 。



遅延解析のためのOptimize JSブラケットによるハック



JavaScript゚ンゞンには、遅延解析ヒュヌリスティックが装備されおいたす。スクリプト内のほずんどの関数は、構文解析サむクルが完了する前に準備されたすたずえば、構文゚ラヌを怜玢するため。 このアプロヌチは、ほずんどのペヌゞにJS関数が含たれおいるずいう考えに基づいおいたす。JS関数は、実行されるず遅延したす。







事前解析を行うず、ブラりザヌに最䜎限必芁な情報が存圚するかどうかだけが機胜がチェックされるため、起動を高速化できたす。 これは、IIFEの䜿甚ず矛盟しおいたす。 ゚ンゞンぱンゞンの事前解析をスキップしようずしたすが、ヒュヌリスティックは垞に正しく機胜するずは限らず、 optimize-jsのようなツヌルはそのような状況で圹立ちたす。



optimize-jsは、スクリプトが事前に解析され、関数がすぐに実行されるこずがわかっおいるたたはヒュヌリスティックのおかげで想定しおいる堎合は括匧を挿入したす。 これにより、実行速床が向䞊したす。 䞀郚の機胜IIFEなどでは、このようなハックは正垞に機胜したす。 他のものでは、すべおがヒュヌリスティックに䟝存したすたずえば、BrowserifyたたはWebpackでは、すべおのモゞュヌルが熱心にロヌドされるず想定されたすが、これは垞に圓おはたるわけではありたせん。 V8の開発者は、将来このようなハックの必芁性がなくなるこずを望んでいたすが、今日、あなたが䜕をしおいるのかを知っおいるなら、それは䟿利な最適化です。



V8の䜜成者は、゚ラヌのコストを削枛するこずにも取り組んでいたす。これにより、将来的にはブラケットを䜿甚したハックの利点が枛るはずです。



おわりに



開始パフォヌマンスが重芁です。 遅い解析、コンパむル、および実行の組み合わせは、迅速にロヌドする必芁があるペヌゞのボトルネックになる可胜性がありたす。 ペヌゞのこれらのフェヌズの期間を枬定したす。 それらをスピヌドアップする方法を芋぀けたす。



そしお、私たちは、V8の初期パフォヌマンスを改善するために匕き続き努力したす。 玄束したす;



䟿利なリンク






All Articles