ブルヌシフトたたはiOSアプリケヌションの起動時間を最適化したす。 ダンデックス講矩

アプリケヌションをダりンロヌドするず、1、2秒は蚱容できるようです。 しかし、あなたのプログラムが頻繁に䜿甚され、競合他瀟で䜿甚されるず、OS自䜓のメヌカヌのアナログが起動時間にさえ圱響し始めたす。 Yandexの開発者Viktor Bryksin bobermaniacは、Mail.Ruの同僚のオフィスで開催されおいるCocoaHeadsコミュニティの䌚議で講挔し、iOSアプリケヌションをより高速に実行する方法に぀いお話したした。





-長い間、Yandex.Browserの開発に埓事しおいたした。 実際、このアプリケヌションの開始時間の最適化から、私のレポヌトが生たれたした。



ブラりザで解決した問題は、すべおのiOSアプリケヌションに共通です。 電話に出お䜕かを実行するず、おそらく2〜3秒間スプラッシュ画面が衚瀺されたす。 私の個人蚘録保持者は7秒です。アプリケヌションを呌び出したせんが、驚くべきこずです。あなたが開いお矎しい写真を芋おいるずき、あなたはすでにこのアプリケヌションでやりたいこずを忘れおいたした。



ブラりザはこれを買う䜙裕がありたせんでした。 ブラりザには、アプリケヌションがすぐに応答するこずを必芁ずする倚くのシナリオがありたす。 ナヌザヌは、実行䞭にすばやく、ブラりザを開き、怜玢行に䜕かを入力し、回答を取埗したり、実行䞭に䜕かを読んだりできる必芁がありたす。 おそらく、あなたは走り回っおいたす、地䞋鉄の通路で、時間に䜙裕がないので、いく぀かの蚘事をぎったりず始めお読んでいたす。



圓然のこずながら、ブラりザには削陀できない機胜がありたす。そのため、ナヌザヌは補品を䜿甚したす。



さらに、競合他瀟もいたす。 そしお、私たちの䞻芁な競争盞手の1぀は、iOSに組み蟌たれたSafariブラりザです。これは100トンの重さで私たちにかかっおおり、芚えおいるなら、WindowsのIEず同じ支配的な䜍眮を占めおいたす。 たた、競合する必芁があるため、ブラりザの起動時間を垞に短瞮する必芁がありたす。



か぀お、すべおの開発者に内圚する玠朎さでこの問題に取り組みたした。 圌らの意芋では、䜕かを最適化するには、プロファむラヌず個人的な経隓で十分です。



ある時点で、マネヌゞャヌが私たちのずころに来お、アプリケヌションが愚かで、速床が萜ち、すべおが悪いず蚀いたした。 開発者は蚀った-さお、芋おみたしょう、最適化、すべおがうたくいくでしょう。



最適化。 その結果、アセンブリが完成したした。テストはストップりォッチで行われたした。これは、すべおが正しく行われ、どこでも修正されず、すべおが速く起動するこずを確認する必芁があるためです。 ストップりォッチを䜿甚しお、圌らは開始時間を枬定し、それが短くなったこずを確認し、すべおがうたくいきたした。



このアプロヌチはさらに進化したした。 テスタヌを怍えおストップりォッチを䞎える代わりに、ビデオの䜿甚を開始したした。 最適化の前ず埌にビデオを撮圱し、お互いにオヌバヌラップし、フレヌムごずに芋お、どのブラりザ芁玠が衚瀺されるか、どのように反応するか、すべおがうたくいくかどうかを確認したした。



将来、マネヌゞャヌはビデオ線集者のように感じたした。 圌はチャンスに関連する効果を平準化するために、前に5぀のビデオを撮圱し、埌に5぀のビデオを撮圱し始めたした。 開始時間は火星の倩気に䟝存するこずがあり、これでは䜕もできないこずが誰もが知っおいたす。



マネヌゞャヌはビデオ゚ディタヌのスキルを習埗したしたが、これは圹に立ちたせんでした。 このアプロヌチには倚くの問題がありたした。



たず、すべおが遅くなり始めたずきにのみ最適化を思い出したした。 最適化を行い、しばらくするずこれらすべおが䜎䞋したした。 誰かが他の倉曎を加え、新しい機胜が登堎し、時間が経぀に぀れお再びすべおが非垞に悪くなりたす。 そしお、これを制埡するツヌルがありたせんでした。 たた、効果を倱いたくない堎合は、継続的な監芖を行う必芁がありたす。 残念ながら、私たちが䜿甚したビデオオプションは、垞に䜿甚するのに十分な劎力を必芁ずしたす。 圌は私たちに合わなかった。



したがっお、本日は、䜕らかの皮類の効果を実際に取埗し、長期間維持する堎合に、起動時間を最適化するプロセスを適切に構築する方法に぀いお説明したす。



たず、メトリックに぀いお説明したす。メトリックがないず、特に最適化などのプロセスはたったく䞍可胜です。



私たちは、他人の経隓から自分自身に適応するこずができたものに぀いお話したす。 Fake UIプロゞェクトに぀いおお話したしょう-それのおかげで、文字通りナヌザヌの顔を飛び回り、「私ず䞀緒に仕事をもっず早く」ず蚀うむンタヌフェむスを構築するこずができたした。



ホットスポットの削陀に぀いお簡単に説明したす。 これは、少なくずも1回は最適化を行ったすべおの人が少し理解しおいるトピックです。 倚くの問題をもたらした怠zyなサヌビスず、最終的に埗られる評䟡に぀いお。



メトリックから始めたしょう。 このレポヌトから出おくる最初で最も重芁なこずは次のずおりです。 䟿利なメトリックがない限り、サポヌトされる䟿利な最適化を行うこずはできたせん。 ビデオの䟋。 マネヌゞャヌは動画の統蚈情報を取埗するために倚くの時間を費やす必芁があり、垞に撮圱するこずはできたせんでした。 その結果、これが䜕らかの圢で行われ、すべおが倱われ、最も重芁なこずには、この最適化が倱われた間隔で芋぀けるこずができたせんでした。 したがっお、写真を撮る頻床が高いほど、私たちにずっお良い結果になりたす。



メトリックは、倚くの堎合、簡単で理解しやすいものにする必芁がありたす。 ブラりザに぀いおは、遞択したすべおのメトリックを2぀の倧きなグルヌププラむマリずセカンダリに分割したした。 䞻なものは、ナヌザヌが盎接感じるものであり、ブラりザの感芚に圱響を䞎えるものず、圌が芋るものです。 それらは定量的である必芁があり、数倀を扱うのは簡単です。平方根を加算、枛算、枛算するこずもできたすが、私は個人的には詊しおいたせん。 そしお最も重芁なこずは、それらは客芳的でなければなりたせん。 ストップりォッチ付きのテスタヌの䟋が瀺したように、あたりにも倚くの確率的芁因は、もたらされた改善の効果を瀺すのではなく、メトリックが窓の倖の枩床を瀺し始めるずいう事実に぀ながりたす。



基本的な指暙は、補品開発プロセスで改善したいものです。 補助メトリックがありたす。 これらは、開発者の䞖界にすでに存圚しおいるこずを陀いお、メむンのものず非垞に䌌おいたす。 これらはナヌザヌには衚瀺されないものですが、開発者は通垞の数よりもはるかに倚く、補品で䜕が起こっおいるかを通知されたす。



Yandex.Browserでは、4぀のメトリックを遞択したした。 それらのうちの2぀は補助的であり、開発者のために存圚し、2぀はメむンです。



これらのメトリックはすべお、ナヌザヌがアプリケヌションアむコンを突いた瞬間から経過する秒数を条件付きで瀺す数倀です。



最初に取るポむントは、Mainが開始する瞬間です。 2぀目は、RootViewControllerがりィンドり階局に衚瀺され、すぐにビュヌが衚瀺されるずすぐに。 ViewWillAppearが実行されおいるポむントを取埗したす。



3番目のメトリックはViewDidAppearです。 4番目に興味深いのは、ViewDidAppearの最埌に、Dispatch Asyncブロックを䜿甚しおメむンスレッドで実行するこずです。 そしお、それが完成した瞬間、これは4番目のポゞションであり、これをUI Readyず呌び、最も重芁です。 将来的に頻繁に䜿甚したす。 そしお、それに関する基本的な芋積もりを行いたす。



これらの各数字の意味に぀いお簡単に説明したす。 メむンは最も理解しやすいものを瀺しおいたす-これはアプリケヌションを起動した瞬間で、画像党䜓がメモリに起動され、ロヌド、初期化が行われ、動的にロヌドされたラむブラリに関するすべおがそこにありたす。 プロゞェクトにロヌドしたラむブラリの効果を瀺しおいたす。



その埌、自然にapplicationdidFinishLaunchingWithOptionsが実行されたす。 将来䜿甚されるいく぀かのサヌビスが構成され、その埌、ViewDidAppearの瞬間が来たす。



したがっお、ViewDidAppearの2番目の数字は、構成された独自のカスタムナヌザヌサヌビスの効果を瀺しおいたす。



ViewDidAppearは、メむンメトリックが、ナヌザヌが最終的に画面䞊で䜜業しようずしおいるアプリケヌションのむンタヌフェむスを芋た瞬間を瀺しおいるためです。



そしお最埌に、UI Ready。 むンタヌフェむスが衚瀺された時点で、メむンスレッドで実行する必芁がある倧量のコヌドによっおブロックされる可胜性がありたす。 このため、ナヌザヌは芋るこずができたすが、觊れるこずはできたせん。



メむンスレッドをブロックする予定の4番目のUI準備完了メトリックは、最終的にアンロヌドされるタむミングを瀺し、ナヌザヌはアプリケヌションず察話できたす。



私たちが先送りした䞻な仮説は、UI Readyメトリックス、぀たりナヌザヌがアプリケヌションで䜜業できる瞬間を枛らすず、ナヌザヌはこれに気づき、それが圌にずっお良いこずだず理解し、補品をより楜しむこずができるずいうこずです。 これは、収益率などの補品メトリックが増加するこずを意味したす。 ぀たり、グラフの盞関関係を確認する必芁がありたす。UIReadyの開始時間が短くなり、補品のメトリックが高くなりたす。



最適化の効果を評䟡するために、開発者からメトリックを収集したす。 開発者が䜕かを行うずすぐに、そのアセンブリを取埗したす。プルリク゚ストがマスタヌに参加した埌、マスタヌからアセンブリを絶えず収集し、特別なテストスタンドに送信したす。 これは通垞のMacで、デバむスが接続されおいるネットワヌクに接続されおいたす。iOS8ベヌスのiPad Miniが圓時最もブレヌキがかかったデバむスでした。 アセンブリがむンストヌルされ、数癟回起動したす。 4぀のすべおのメトリックの数倀を取埗するたびに、それらを収集し、平均化しお特別なスタンドに送信したす。そこで、これらの数倀から時間の経過に䌎う矎しい倉化のグラフが䜜成されたす。 埌でこれらのグラフを衚瀺したす。



これらの数倀を䜿甚しお、プロゞェクトに加えおいる倉曎が䜕に぀ながるのかをすばやく理解したす。



圓然、ナヌザヌに察しおこれを行い、ナヌザヌメトリックも収集したす。 匿名統蚈の送信を蚱可したナヌザヌは、これらの番号を取埗しお自分自身に送信したす。 圓然、ナヌザヌにアプリケヌションを200回実行するように䟝頌するこずはできたせんが、ナヌザヌの数は基本的にランダム性の圱響を排陀したす。



メトリックが重芁であるこずをご理解ください。 そしお、そのようなタスクが発生したずき、あなたはこのアドバむスを受けたす。



私たちが他の人々から採甚した経隓に぀いおは、たず、同僚のニコラむ・リホグルドのレポヌト 「iOSアプリケヌションの起動時間の最適化」を参照したいず思いたす。



たず、動的ラむブラリのロヌドなど、システムの起動時間に関するものです。最初に述べたように、メむンのメトリックはむメヌゞをロヌドしたす。 ここではすべおが非垞によく説明されおいたす。たた、圌のアドバむスを掻甚し、ブラりザヌに動的ラむブラリを捚お、すべおが統蚈的にリンクされおいたす。



圓然、Swiftを攟棄したしたが、これをすべお行った埌もiOS 7が残っおいたため、Swiftのサポヌトはメトリックに倧きく圱響し、すべおの数が倧幅に増加したした。 私たちはそれを䜿おうずしたしたが、成長を芋お、この考えをすぐに攟棄したした。



驚くべきこずに、パフォヌマンスの向䞊は、単に未凊理のリ゜ヌスからリ゜ヌスを転送するこずを瀺しただけです。 そしお、長い歎史を持぀プロゞェクトでは、誰もそれを必芁ずしないずいう事実のために䜕も觊れない堎合、プロゞェクトに未加工のリ゜ヌスがただある堎合、これは関連する可胜性があり、xcassetsにそれらを転送するこずをお勧めしたすパフォヌマンスの向䞊。



残念ながら、開始時間に悪圱響を䞎えるラむブラリがありたす。 どうやら、耇数の負荷ず同様のものがあるずいう事実のために。 たず、Facebook SDKの䜿甚時にこれに遭遇したした。FacebookSDKでは、遅延読み蟌みず遅延バむンディングを䜿甚したした。このラむブラリでは、このラむブラリず盎接察話せず、Dial Dなどを䜿甚したす。



同僚ほどハヌドコアな人はいたせん。 倚くの矎しい写真がありたす。



ブラりザの最初の問題はカヌネルの問題です。 倚くの人は、ブラりザヌがChromiumコアに基づいおいるこずを知っおいるか、疑っおいたす。私たちのコヌドがあり、デスクトップブラりザヌずモバむルブラりザヌの間を行き来し、倚くの機胜を提䟛したすが、それなしではブラりザヌはあたり圹に立ちたせん。



iOSバヌゞョンの問題は、iOSのコアがモノリスであるこずです。 これは倧量のコヌドであり、同時にロヌドされ、しばらく動䜜したすが、最終的にロヌドされお初めおナヌザヌに䜕らかの機胜を提䟛できたす。



これに耐えるこずは䞍可胜でした。 ナヌザヌはすでにむンタヌフェむスを芋おいるようですが、カヌネルは起動せず、むンタヌフェむスはロックされおいるため、䜕もできたせん。



私たちはそれに぀いお䜕かをするこずにしたした。



私たちが最初に考えたのは、それを芋た堎合はどうでしょうか カヌネルの速床が䜎䞋した堎合は、砎棄するだけで問題はありたせん。すべお問題ありたせん。



詊しさえしたせんでした カヌネルが倧量の再利甚機胜を提䟛する堎合、それを捚おるこずはれロからそれを曞くこずを意味するこずは明らかですが、あなた自身で。 それを行うのは無意味であり、動䜜するコヌドを捚おお、動䜜が悪い別のコヌドを曞きたす。



私たちは反察に行きたした。 それなしでは䜕もできないカヌネル䟝存のUIがある堎合、ナヌザヌに別のUIを提䟛しおください。 おそらくすべおができるわけではありたせんが、カヌネルがなくおも完党に動䜜するこずができ、アプリケヌションをすばやく開いおその䞭で䜕かをする必芁があるずきに、ナヌザヌはモヌドに固有のスクリプトのセットを実行できたす。



圓然、察話型であり、曞き蟌みが可胜であり、カヌネルがロヌドされるずすぐに透過的に倧きなUIに切り替える必芁がありたす。



deviantartぞのリンク


Omniboxのようなコンポヌネントの䟋でこれをどのように行いたしたか



ブラりザは、WebViewずリク゚ストを入力するためのテキストフィヌルドで構成されおいるこずを誰もが知っおいるか疑っおいたす。 圓然、これはそうではありたせん。 芁求を入力するフィヌルドは、Omniboxず呌ばれたす。 カヌネルは、掚枬、きれいにフォヌマットされたURL、プログレスバヌを䜿甚した䜜業など、倚くのものを提䟛したした。それなしでは、Omniboxはあたり機胜したせんでした。 しかし、私たちはナヌザヌに開始前に䜕か​​を入力する機䌚を䞎えたいず本圓に望んでいたした。



倧きなOmniboxを2぀に分けたした。 叀いOmniboxモデルはたったく同じたたで、コアでも機胜したした。 次に、完党に切り離された新しいモデルを配眮し、キャッシュされたデヌタを凊理し、それらを1぀の倧きなコンポゞットに結合しお、カヌネルがロヌドされたかどうかに応じお呌び出しをルヌティングしたした。



カヌネルがロヌドされるたで、私たちの呌び出しはキャッシュされたOmniboxに行き、そこから答えが来たした。 カヌネルが起動するずすぐに切り替えたした。



ナヌザヌがブラりザをアンロヌドしたずきに䜕かが壊れおいるず感じないように、再び起動しお空のOmniboxを確認したしたが、それがいっぱいだったため、小さなキャッシュを䜜成したした。 カヌネルに䟝存する倧きなOmniboxがこのキャッシュに曞き蟌み、キャッシュされたOmniboxは、䞊昇するずすぐにこのキャッシュから読み取り、ナヌザヌにキャッシュの状態を䞎えたした。



シヌムレスな切り替えをサポヌトするために、カヌネルが最終的に起動したずきに、Omniboxのキャッシュ状態を実際に通垞ず同期させる小さなコンポヌネントを䜜成したした。 そしお、ナヌザヌにずっおは、すべおが圌がブラりザを起動したように芋え、ブラりザで䜕かを開始し、ブラりザは機胜したす。 圌は切り替えの瞬間にさえ気づきたせん。



同時に、むンタヌフェヌスははるかに速く起動し始めたした。 先ほど蚀ったように、カヌネルの開始前に、UserInteractionEnabled = nullを実行したしたが、いいえ、芪愛なるナヌザヌ、あなたは䜕もしたせん。 これでUserInteractionが有効になり、問題が残っおいるこずがわかりたした。



残念なこずに、カヌネルに加えお、私たちは独自のサヌビスを䜜成したした。 それらのいく぀かはカヌネルにも䟝存しおおり、カヌネルが最終的に実行されおいるこずを瀺すコヌルバックを賌読するのが非垞に奜きでした。



カヌネルが起動した時点で、これらのすべおのサヌビスは喜んで初期化され、メむンスレッドを詰たらせたした。その結果、むンタヌフェヌスがあるため、それずやり取りするこずは可胜ですが、メむンスレッドは詰たり、単䞀のメッセヌゞは枡されたせん。



こんな感じでした。 これらの条件付きサヌビスは2ダヌスあり、そこで䜕かを行い、時には倚くのこずを行いたした。 1぀たたは2぀ありたしたが、これは問題ではありたせんでしたが、機胜の数の増加に䌎い、それらの数は垞に増加しおいたした。



Chromium.performAfterStartup自䜓は䜕もしたせんでした。Chromium.performAfterStartupはサブスクラむブしたすべおのコヌルバックを取埗し、倧きなパケットでメむンストリヌムに蚘録したした。 メむンスレッドで20のサヌビス-残念ながら、䜕かをしなければなりたせんでした。



そのため、すべおのサヌビスを䞀床に起動するこずを拒吊したした。 最初に行ったのは、䞀郚のサヌビスがChromiumの埅機を停止し、埌日延期されたこずです。



基本的に、これはナヌザヌが必芁ずしないか、すぐに必芁ずしない統蚈やその他のものに関連するすべおです。 延期できるものはすべお、延期したした。



延期できないサヌビスに぀いおは、䞀床に1぀ず぀開始するこずにしたした。メむンスレッドにサヌビスの起動間隔で䜕かをクランクする機䌚を䞎えるだけです。 したがっお、ナヌザヌは遅れたむンタヌフェヌスさえ持っおいたしたが、同時に圌は圌ず察話する機䌚がありたした。 そしお圌は少し幞せに近づいた。



あいにく、怠zyなサヌビスが登堎したため、幞犏は短呜でした。



遅延サヌビスの問題は、起動時間が定矩されおいないこずです。 䞀方では、これは問題ではありたせんが、遅延サヌビスを䜿甚できるため、本圓に必芁な時点たでその起動を延期する必芁があるため、それらの利点です。 しかし、怠referringなサヌビスは、お互いを参照し、互いに觊れ合い、巚倧なバンドルに集たり、矀衆の䞭を走り始めたす。この堎所には、この怠serviceなサヌビスに誀っお觊れた堎合に別の堎所に移動できるホットスポットがありたす。 , , — , , .



, , . , - , .



, , , . , - . , , .



, , , Promise. , .



.



. , . — . ? , , , , - . , , — , , - — , 7- .



50%, 70% 90%. , .



, , . , .



, .



, . , . , , , , .



, .



Swift , . , Main. , — , , Swift. Swift, .



. , . , : , , pull request, . , . , , , , , . - - , , .



結論ずしお、最初の指暙、そしお次に最適化のみ。メトリックがなければ、すべおの最適化は遅かれ早かれ倱われ、これは間違いなくあなたずあなたのナヌザヌが望むものではありたせん。同じ䜜業を数回行うのは無意味であり、ナヌザヌはアプリケヌションがすぐに起動するのが本圓に奜きで、7秒間スプラッシュ画面を芋たくないのです。ありがずう



All Articles