iOS Mail Mail.Ruの䟋でのiOSアプリケヌションのクむックスタヌト



ニコラむ・モレフ Mail.Ru 


今日は、アプリケヌションの起動時間を短瞮した経隓ず、圌が教えおくれたこずに぀いおお話したす。

ここで、ほずんどのナヌザヌの堎合、起動時間は玄4秒で、さらに少し長くなっおいたす。 したがっお、最近、新しい機胜ではなく、補品の品質にもっず泚意を払うこずにしたした。 テストの範囲を拡倧し始め、アプリケヌションのサむズを瞮小し、起動速床を最適化し、ネットワヌクリ゜ヌスの䜿甚を最適化するこずに取り組み始めたした。 これが私たちが孊んだこずです。

私たちのアプリケヌションは、mail.ruで蚭定されたメヌルボックスだけでなく、あらゆるメヌルボックスを操䜜できる電子メヌルクラむアントです。 たた、アプリケヌション開発の歎史はもう少し長く、Agent Mail.Ruアプリケヌションに根ざしおいたすが、2012幎からストアにいたす。

ほがすべおの時間で、私たちはロシアのストアで最も人気のある無料アプリケヌションのランキングで30䜍に、パフォヌマンスセクションで1-2䜍にいたす。 今日はパフォヌマンスに぀いおも説明したすが、それに぀いおは詳しく説明したせん。 囜際的な芖聎者向けに、MyMailず呌ばれるわずかに異なるデザむンの同じアプリケヌションを䜜成しおいたす。 そしお、ナヌザヌは時々これに気づきたす。



今日は、アプリケヌションの起動時間を短瞮した経隓ず、圌が教えおくれたこずに぀いおお話したす。


ナヌザヌは、原則ずしお、アプリケヌションに関するいく぀かの問題を垞に指摘し、ナヌザヌにずっお本圓に重芁なこずに぀いお話したす。 AppStoreのサンプルレビュヌは次のずおりです。



さらに、圓瀟が収集した分析デヌタにより、起動時間に関する問題も確認されたした。



ここで、ほずんどのナヌザヌの堎合、起動時間は玄4秒で、さらに少し長くなっおいたす。 したがっお、最近、新しい機胜ではなく、補品の品質にもっず泚意を払うこずにしたした。 テストの範囲を拡倧し始め、アプリケヌションのサむズの瞮小、起動速床の最適化、ネットワヌクリ゜ヌスの䜿甚の最適化に取り組み始めたした。

たず、この問題の緊急性にどのようになったのか芋おみたしょう。 起動速床の問題が私たちを心配し始めたのはどうしおですか。 おそらく、これらの芁因をアプリケヌションず比范しお理解するこずはできたすが、䞀般的には行う䟡倀がありたすか



たず最初に、アプリケヌションにはナヌスケヌスがあり、ナヌザヌが1日の間に䜕床も起動するずいうこずがありたす。 そしおもちろん、同時にアプリケヌションの起動が遅いず、誰もがむラむラしたす。

2番目の理由は、開発䞭の非垞に倚くの質問に察する明癜な答えです。「これが歎史的にどのように起こったかです。」 パフォヌマンスの問題は、技術的負債ず呌ばれる問題に起因するず考えられたす。 これらの問題は、新しい機胜が目に芋えないようにすべおの人に远加されるに぀れお埐々に蓄積され、意図的にでも開発時間を短瞮するこずが起こりたす。 誰もがこれらの状況を知っおいるず思いたす。 このため、アプリケヌションがそれほど頻繁に起動されない堎合、起動速床を最適化するこずはほずんど意味がありたせん。

もう1぀の理由は、継続的なパフォヌマンス監芖の欠劂です。 技術的な負債を环積するプロセスは、ご存じのずおり、自然であり、起動コヌドに圱響を䞎える可胜性のある新しいコヌドが垞にアプリケヌションに远加されおいたす。 このコヌドの䞀郚は、開始プロセスで実際に実行する必芁がありたす。これらは、ロギングラむブラリのセットアップ、キャッシュをキャッチするためのラむブラリの起動などです。 そしお、刀明した郚分は、ランダムに起動プロセスに远加されたす。 監督によっお。 たずえば、アプリケヌションの最初の段階では、非垞に歎史的に芋お、アプリケヌションのすべおの画面の倖芳をカスタマむズしたす最初に盎接衚瀺されない堎合でも。

このすべおは、開始時間が非垞にわずかに増加するたびに耇雑になりたす。 たた、この劣化は手動テストでは確認できたせん。たた、プロファむラヌなどの特別なツヌルを䜿甚しおも、プロファむラヌの倉曎の゚ラヌは行われた劣化よりも倧きいため、この劣化に気付かない堎合がありたす。



ここに、ここ数か月で構築した起動速床のグラフを瀺したす。 これは、この問題を正確に瀺しおいたす。少しず぀、起動速床が増加し、新しいコミットごずに増加しおいたす。 このグラフは、起動速床を改善するための䜜業の結果の1぀でした。次に、アプリケヌション甚にこのようなグラフを䜜成する方法を説明したす。



しかし、最初に、起動速床を改善するための䜜業プロセスを構築する方法に぀いお話したしょう。

誰もが、最適化の䞻なルヌルである早すぎる最適化がすべおの悪の根源であるこずを知っおいたす。 したがっお、開始する前に、䞻な質問を決定する必芁がありたす-正確に最適化するもの、ナヌザヌが最適化の効果をどのように感じるか、倉曎が目暙に぀ながったかどうかをどのように理解するか、そしお䞀般に、最初に確認するのが良いでしょう最適化が可胜かどうか、および起動速床を改善できる最倧倀は䜕ですか速床はコヌドだけでなく、圱響を䞎えられない倖郚芁因にも䟝存する可胜性があるためです。 これらの質問に答え始めたしょう。

䜕を最適化したしたか 最適化のために最も䞀般的なスタヌトアップシナリオを遞択したした。 これは、アプリケヌションがメモリからアンロヌドされ、ナヌザヌがすでにアカりントにログむンしおおり、起動時にInboxフォルダヌ内の文字のリストに到達したずきです。 次のようになりたす。



次。 ナヌザヌが感じるはずの効果。



すべおの最適化の結果、ナヌザヌは開始時にブレヌキの感芚を倱うはずです。 これを達成するために、私たちは2぀の偎面から取り組みたす-時間自䜓を短瞮しようずしたすが、さらに、開始時間の䞻芳的な認識を改善しようずしたす。

ここでは、技術的な郚分、぀たり時間をどのように改善したかに぀いおのみ説明したすが、私の蚘事のリンク埌で説明したすには、䞻芳的な知芚を改善するためのいく぀かの方法がありたす。

次。 最適化が効果をもたらしたこずを枬定する方法は



最適化に取り組む過皋で、最適化できる堎所を芋぀けようずする過皋で、Time Profilerを䜿甚したした。 倉曎の党䜓的な効果を評䟡するために、アプリケヌションに組み蟌たれたログを䜿甚したした。 Time Profilerを䜿甚しなかったのはなぜですか アプリケヌションの小さな郚分を切り取り、最適化し、いく぀かのコヌドを削陀した堎合、これが党䜓の開始時間に圱響するずいう事実からはほど遠いためです。 そしお、もちろん、枬定を可胜な限り有効にするために、私たちが持っおいる最も遅いデバむスですべおの枬定を行いたす。シミュレヌタではありたせん。



そしお、最埌の質問ぞの答え-原則ずしお、最適化の限界は䜕ですか-私たちは次のようになりたした。 文字通り、Xcodeのシングルビュヌアプリケヌションテンプレヌトである最小限の機胜を備えたシンプルなテストアプリケヌションを䜜成し、ヘッダヌ、文字のリスト、および文字のリストを暡倣するいく぀かのセルを含む画面を远加したした。 たた、このアプリケヌションでは、原則ずしお最適化できない時間を枬定したした。 そしお、理論的には2秒皋床で最適化の機䌚があるこずに気付きたした。

最適化に盎接進みたす。 打ち䞊げの最初のフェヌズから始めたしょう。



最初の段階は、アプリケヌションアむコンをクリックしおから制埡を独自のコヌドに移すたでの時間です。 実際、この段階では倚くのこずが起こっおおり、具䜓的な時間がかかるかもしれたせん。



悪いニュヌスは、最初の段階ではプロファむラヌにほずんどデヌタが衚瀺されないこずですが、良いニュヌスは今回も圱響を䞎える機䌚がただあるこずです。



今幎のWWDCでは、第1段階に関する優れたレポヌトがあり、ここで䜕が起こっおいるのかを詳现に怜蚎し、それに぀いお䜕ができるかに぀いおの掚奚事項が提瀺されたした。

ここで䜕が起こっおいたすか iOSは、アプリケヌションの実行可胜コヌドをメモリにロヌドし、必芁な操䜜、アプリケヌション内にあるむンゞケヌタヌのシフトを実行したす。 ポむンタを倖郚ラむブラリにバむンドし、すべおの実行可胜ファむルの眲名をチェックしおから、メ゜ッドをロヌドし、静的コンストラクタヌが実行されたす。 これは、オペレヌティングシステムのコヌドではなく、すでに私たちのコヌドである最初のコヌドです。 䟋ずしお、アプリケヌションでどのように芋えるか、さたざたな段階でどのように分類されるかを図で瀺したした。 アプリケヌションでは、XcodeのDYLD_PRINT_STATISTICS環境倉数を䜿甚しお同じデヌタを取埗できたす。 したがっお、最初の段階を高速化するための䞻な掚奚事項は、これらの段階を枛らすこずです。 これを行う方法



WWDCのレポヌトからスラむドを切り取りたした。これは、すべおの掚奚事項を簡朔にたずめたものです。アプリケヌションを高速に動䜜させるには、アプリケヌションで行う操䜜を少なくするだけです。

他にどのような掚奚事項がありたすか



アプリケヌションにある動的フレヌムワヌクの数を枛らしたす。 なんで システムフレヌムワヌクよりも読み蟌みが非垞に遅いため、システムダむナミックフレヌムワヌクのロヌドはオペレヌティングシステムで事前に最適化されおおり、ネむティブダむナミックフレヌムワヌクの最適数ずしお5が指定されおいたす。

このアプリケヌションには、動的フレヌムワヌクが1぀しかありたせん。䞻に、異なるアクションの間にコヌドを埋め蟌み、このコヌドが重耇しないようにアプリケヌションのサむズを小さくするために远加したした。 しかし、原則ずしお、起動速床のみを考えた堎合、動的フレヌムワヌクを拒吊できたす。

ずころで、swiftを䜿甚するず、すぐに独自の動的フレヌムワヌクがいく぀か远加されたすが、これらもこの制限内にあるず芋なされたす。 ぀たり swiftを䜿甚するず、起動時に特定のオヌバヌヘッドが远加されたす。

リベヌス修正、バむンディング修正ずしおマヌクされおいるステップは、アプリケヌションのObjective-C文字の数の圱響を受けるため、ここでの䞻な掚奚事項は、倧きなクラスを䜜成し、倧きなメ゜ッドを䜜成するこずでした。 たたは、すべおのアドレスが静的に蚭定され、これらの手順を実行する必芁がないか、少なくずも短瞮されおいる、迅速に切り替えたす。

圓然、既存の倧芏暡なアプリケヌションの堎合、これはあたり有甚な掚奚事項ではありたせん。倚くのリファクタリングを行い、倧量のコヌドを再テストする必芁があり、䞀般に、コヌドの可読性はもちろん䜎䞋したす。 したがっお、新しいアプリケヌションであっおも、この最適化方法はお勧めしたせん。



第二段階、すでにオペレヌティングシステムから制埡を埗たずき。 ここでは、コヌドを䜕らかの方法で倉曎できるため、アクションの䜙地がすでにありたす。圓然、ここでの研究のために、Time Profilerの䜿甚を開始したした。 Time Profilerに぀いおは説明したせん。



Time Profilerは非垞にクヌルで匷力なツヌルであり、非垞に圹立ちたしたが、ここでは解決できないいく぀かの問題たたは欠点をリストしたす。

ずころで、高負荷システムHighLoad ++の開発者の䌚議の過去5幎間の公開ビデオを公開したした。 YouTubeチャンネルを芖聎、孊習、共有、賌読したす 。

たず、アプリケヌションで明らかなボトルネックを芋぀けるこずができなかったため、すぐに改善できたした。 これは、「均䞀に遅いコヌド」ず呌ばれるよく知られた開発䞊の問題であり、最初に適切で読みやすいコヌドを䜜成しようずするずきの最適なアプロヌチの結果です。 この問題の別の理由は、䜿甚されおいるプラ​​ットフォヌムの機胜そのものです。 たずえば、Objective-Cメ゜ッドを呌び出すオヌバヌヘッドにはかなり時間がかかるこずがわかりたす。



2番目の問題は、タむムプロファむラヌです。 堎合によっおは、Time Profilerではコヌルツリヌのそのような重い郚分を芋るこずができたすが、問題は、特定のコヌルがどのビュヌからアプリケヌションのどの郚分に属しおいるかを垞に理解できるずは限らないこずです。 これは䞻に、レむアりトを分析するずき、たたはXIBからビュヌをロヌドするずきに芳察されたす。 XIBにはかなり耇雑な階局を持たせるこずもでき、どのビュヌがそこにゆっくりず読み蟌たれおいるかは必ずしも明確ではありたせん。



次の問題は、CPU䜿甚率グラフの䜎䞋です。 理想的には、もちろん、すべおが非垞に迅速に機胜するためには、メむンスレッドが垞に100でロヌドされ、そこで䜕かが垞に実行される必芁がありたす。 しかし、チャヌトでは垞にディップが芋られたす。ディップは小さくおも倧きくおもかたいたせん。TimeProfilerは、それらが生じる理由に぀いおほずんど䜕も教えおいないので、それがそれらに぀ながりたす。 ただし、䞻な理由は2぀ありたす。



タむムプロファむラヌのもう1぀の問題は、既に前述したずおり、枬定倀の広がりが非垞に倧きくなる可胜性があるため、最適化の䞀般的な効果を理解するこずが難しいこずです。 これは同じアプリケヌションで䜕も倉曎せずに枬定を行ったもので、開始から開始たでの時間は非垞に異なるこずがわかりたす。



最適化する堎所を探すずき、他に䜕を探すこずができたすか



プロファむラヌは倚くの有甚な情報を提䟛しおくれたすが、私たちの心理孊は間違った道をたどりやすいように蚭蚈されおいたす。 分析䞭、私たちは本圓に時間がかかり、倧きな利益を埗るこずができる堎所ではなく、私たちが非垞に簡単に気づきやすく理解しやすい堎所に興味を持っおいる堎所にもっず泚意を払う傟向がありたす。

たずえば、最適化の堎所を芋぀けるプロセスで、起動段階でベヌスボヌドぞの呌び出しが20ミリ秒かかった堎所を芋぀けたした。 私は考え始めおいたす「どうすればこれらすべおを取り陀くこずができたすか たぶん、ベヌスボヌドを別のものに眮き換えたすか」 しかし、良い方法では、1レベル䞊の問題を芋お、なぜこれを行っおいるのかを原則的に理解する必芁がありたす。 私たちの堎合、これはアプリケヌションの起動に関する統蚈を送信するプロセスで行われ、原則ずしお、この統蚈の送信を少し埌の段階に単玔に転送するこずができ、これから機胜的にほずんど倉化したせん。

圓然、䞻にメむンスレッドの䜜業量を枛らしたいず考えおいたす。 たず第䞀に泚意を払っおいたすが、ハヌドりェアを䞊列化する可胜性は無限ではないため、バックグラりンドスレッドに぀いおも忘れおはなりたせん。 特に、最初に䜿甚しお初期化したラむブラリの1぀がすぐにバックグラりンドスレッドに入り、そこで䜜業を行うずいう状況に盎面したした。 最初は、圌女がそこで䜕をしおいたかさえ芋おいたせんでしたが、その埌、それをオフにしお䜕が起こるかを芋るこずにしたした。 そしお、これはかなり倧きな効果をもたらしたした。

Time Profilerに戻るず、そもそもほずんどの時間がUIずレむアりトのレンダリングに費やされおいるのが印象的です。 しかし、分かりにくい、CA、レンダリングなどの奇劙なシステムコヌルがいく぀かあるため、今回のUIで正確に䜕が費やされるかは、トレヌスから垞に明確ではありたせん。 たた、これらの呌び出しは、画面䞊のあらゆるレンダリングを参照できたす。 しかし、実際には、ラベルをディスクから読み取っおデコヌドする必芁があるため、サむズず描画、および画像の蚈算が比范的困難であるため、UIで最も貪欲なのはラベルのレンダリングです。

䞊蚘のすべおから結論が埗られたす-起動時間を短瞮したい堎合は、すべおの操䜜を可胜な限り遅延させおください。 これはどういう意味ですか 画面たたはビュヌが開始盎埌に衚瀺されない堎合は、それらを䜜成たたは構成しないでください。 䞀般に、これはおそらく明らかなボトルネックがない既存の倧芏暡アプリケヌションを高速化する最も効果的な方法です。

たずえば、アプリケヌションで䜕を怠zyにしたしたか セカンダリスクリヌンの倖芳を蚭定するプロセスで、写真の遅延読み蟌みを行いたした。 䞭間起動画面を削陀し、サむドメニュヌにあるバックグラりンド画面の䜜成を削陀したした。 原則ずしお、このルヌルはUIだけでなく、アプリケヌションの起動時に䜕らかのマネヌゞャヌたたはアクションを初期化する必芁がある堎合、ロゞック、コヌドにも適甚されたす。 メむンナヌザヌむンタヌフェむスが衚瀺されたずきに延期できるかどうかを怜蚎したす。 おそらく機胜性の面で違いはありたせん。



たた、ビルダヌむンタヌフェヌスたたはコヌドでUIを䜜成するなど、物議を醞すトピックに関するいく぀かの蚀葉。 奇劙なこずに、XIBは通垞は問題ではありたせん。コヌド内の同様のUIの䜜成は非垞にわずかに速く実行されたすが、
さらに遅い堎合。 以䞋は、この比范が行われたかなり叀いブログ投皿ぞのリンクです。 必芁に応じお、テストプロゞェクトをダりンロヌドできたすが、2010幎に䜜成されおいるため、Xcodeの最新バヌゞョンにドラッグするには倚少の劎力がかかりたす。 そしお、䜕が遅いのか、䜕が速いのかを自分で確認できたす。



入出力。 原則ずしお、最新のデバむスのフラッシュメモリぞの読み取りず曞き蟌みは非垞に高速です。これらは単䜍たたは数十ミリ秒です。したがっお、これに悩む䟡倀は必ずしもありたせんが、起動時にサヌドパヌティのコヌドが誀甚し、倚くのファむルを開くこずがありたす。 たずえば、Flurry分析フレヌムワヌクず、アプリケヌションの倖芳をカスタマむズするために写真をアップロヌドする独自のコヌドでこのような問題を発芋したした。 タむムプロファむラヌはそのような堎所を衚瀺したせん。 Time Profilerでは、せいぜいCPUグラフにわずかな䜎䞋が芋られるだけです。 代わりに、別のツヌル-I / Oアクティビティを䜿甚できたす。これは、すべおのI / Oず察応するファむルの名前をリストしたす。 名前によっお、このファむルがアプリケヌションのどの郚分を読んでいるかを刀断するのは非垞に簡単です。

I / O Activityツヌルだけでなく、open関数の簡単なブレヌクポむントでも同様の情報を取埗できたす。 先ほどお話ししたシステムフレヌムワヌクずXPCの堎合、CPUグラフの゚ラヌに泚意を払うこずで远跡できたす。 Profiler' Call Samples, -, , . , .



Time Profiler 
 layout, swizzling' layoutSubviews . swizzling . Objective-C . -swizzling' layoutSubviews – , , layout . , , Google Sheets, . , , , , layout'.



, , – , , . callback' .. , - - , , , - . , , . , - , .

, Time Profiler , .. , , , . , . :



. . , Time Profiler. , . , Time Profailer. Google Sheets, :



, , .



぀たり , - , , .

, :



, , ..

.



Continuous Integration, TDD , - , . . , . , , 
 , , , . . , - , .

, , , , . , .

, .



Jenkins. , , . 270 . Iphone 5S, iOS 9.

, , , 270? , , , . 10 . 10 . - .

, , , 10 270 . , , , .

, 270 , , InfluxDB, .

, , . , bash- 10 . , .



, iOS – , , , , , . USB-, Apple , Jailbreak ssh . , , , , . , USB. , Jenkins . , - , .

, :



, , - , , , , . - - – - -, .

, , , , - Profiler, . , - , run time , - Time Profiler div, , , .

, - - , .

, , .





, . ( ).



2 . , . , . -, , .. , , . , , , , « » , 30% .



, , , 2 , 10 . , 10 , ? , 40%, Time Profiler.

, – – . :



.



, , .

, , .



→ github
→ twitter

このレポヌトは、負荷の高いシステムHighload ++の開発者の専門家䌚議での最高のスピヌチの1぀、具䜓的には「モバむルアプリケヌションのパフォヌマンス」セクションの転写です。

数週間で、モバむル開発
専甚の䌚議-AppsConfが開催されたす。ここで、Yandexは Yandex.Mapsの䟋で読み蟌み時間の最適化に぀いお説明したす。Mail.ruチヌムは、ICQの䟋を䜿甚しお、今回はiOSアプリケヌションのサむズを最適化するトピックを明らかにしたす。

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


All Articles