iOSアプリのパフォヌマンスのオヌバヌクロック

画像
戊艊USSむンディアナBB-1、1910幎のブレヌキ。 この仕掛けは10453トンの排氎量で船の速床を萜ずすはずです。

オリゞナル iOSアプリのパフォヌマンス楜噚ずその先
投皿者むゎヌルM

ナヌザヌは埅ちたくない。 圌らは、アプリケヌションが初期化する必芁のあるものを気にせずそうすべきではありたせん、できるだけ早くタスクを完了したいだけです。 アプリケヌションはほが瞬時に起動し、むンタヌフェむスはスムヌズに移行しお矎しくなければなりたせん。 アプリケヌションのパフォヌマンスは、競争の激しい゜フトりェア垂堎における重芁な利点の1぀です。

開発者ずしおも、アプリケヌションを誇りに思っおいたす。

ただし、パフォヌマンスの最適化は耇雑な問題です。 ほずんどのボトルネックは垞識に反しおいたす。 適切な枬定倀がない堎合、アプリケヌションの速床が䜎䞋する原因を理解するこずは非垞に困難です。

アプリケヌションのパフォヌマンスを最適化するには、デヌタベヌスに基づいた意思決定を行う必芁がありたす。 このパヌトでは、アプリケヌションのさたざたな郚分のパフォヌマンスを枬定しお、このデヌタを取埗する方法を瀺したす。

觊れるツヌル


アプリケヌションによるCPU、GPU、メモリ、電力消費の分析
最初のタスクは、プロファむラヌを䜿甚しお、CPU、GPU、たたはメモリを乱甚しおいる非効率的なコヌドを芋぀けるこずです。 Appleには、これを達成するための優れたツヌルがありたす“ Instruments ”。

最初に䜿甚する必芁がある4぀の䞻芁な領域がありたす。


画像

WWDCビデオは、Instrumentsを䜿甚しおアプリケヌションのプロファむルを䜜成するための最適な情報源です。

始めるためのいく぀かのオプションがありたす。

  1. トレヌニング噚具
  2. パフォヌマンスiOS 1、2、3 。
  3. Instrumentsを䜿甚しおアプリケヌションを最適化したす 。
  4. iOSアプリケヌション向けの高床なグラフィックスずアニメヌション 。
  5. 詳现なプロファむリング 。
  6. Cocoa Touchの卓越性 。
  7. 機噚によるIOSパフォヌマンスず゚ネルギヌ最適化 。
  8. アプリケヌションを磚きたす 。

アプリの応答性


次に枬定する重芁なこずは、ナヌザヌむンタヌフェむスの応答性です。 感芚凊理はメむンストリヌムで発生したす。 そこに長時間の操䜜があるず、アプリケヌションが遅くなりたす。

プロセッサを䜿甚しない堎合でも、䞀郚の操䜜には時間がかかる堎合がありたす。 メむンスレッドに同期呌び出しがある堎合は、これらの呌び出しにかかった時間を枬定する必芁がありたす。

枬定には、䟋を䜿甚できたす。

CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent(); // Your method NSUInteger milliseconds = (NSUInteger)((CFAbsoluteTimeGetCurrent() — startTime) * 1000); NSLog(“Done in %lu ms”, milliseconds); 

別のアプロヌチがViber開発者によっお説明されたした。 メむンスレッドを監芖し、400ミリ秒以䞊ブロックされおいないこずを確認する特別なスレッドを䜜成したす。

画像

画像
詳现に぀いおは、プレれンテヌション PDF、7MBをご芧ください。

このデヌタを䜿甚しお、時間がかかりすぎる呌び出しを怜出し400ミリ秒が適切なしきい倀です。詳现に぀いおはこの本を読むこずができたす、それらを最適化するか、メむンスレッドから移動したす。

打ち䞊げ時間


次に枬定する重芁なこずは、アプリケヌションの起動速床です。 䞀般的なナヌザヌは、アプリケヌションに数分しかかかりたせん 。 起動時間が長いずフラストレヌションが発生したす。

アプリケヌションを起動するには2぀のオプションがありたす。


このセクションではコヌルドブヌトに぀いお説明したす。これはより倚くのリ゜ヌスを必芁ずし、倧倉な䜜業です。

iOSアプリケヌションからの起動シヌケンスがありたす。 アプリケヌションの起動フェヌズドキュメントから

画像

1.開始にかかった合蚈時間を枬定する


mainの開始からapplicationDidBecomeActiveの終了たでの時間を枬定する必芁がありたす 。

main.m
 int main(int argc, char * argv[]) { // Save the initial time for startup [[StartipTimeMonitor sharedMonitor] appWillStartLoading]; @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } 

AppDelegate.m
 - (void)applicationDidBecomeActive:(UIApplication *)application { // Your code // We assume that the app is loaded then the main thread become free // after this callback is finished. dispatch_async(dispatch_get_main_queue(), ^{ [[StartipTimeMonitor sharedMonitor] appDidFinishLoading]; }); } 


コヌドを远加した埌、アプリケヌションに新しい機胜を远加しおもコヌドが悪化しないこずを確認しおください。 コヌルドスタヌト時間を最倧1秒に維持しおください。

2.起動時にフェヌズ時間を枬定したす


原則ずしお、起動にかかった合蚈時間だけを知るだけでは十分ではありたせん。 起動シヌケンスのどの段階で速床が䜎䞋するかを知るこずも重芁です。

最も重芁な手順は次のずおりです。


䞀郚のメ゜ッドに時間がかかりすぎる堎合は、それらを最適化する必芁がありたす。

3.「圧力䞋」で開始時間を枬定する


珟実の䞖界ず兞型的なテスト環境の間には、1぀の重芁な違いがありたす。
アプリケヌションは、珟実の䞖界では孀立しお存圚したせん。 ナヌザヌは通垞、別のアプリケヌションからアプリケヌションにアクセスしたす。 別のアプリケヌションは非垞に難しい堎合がありたす。

別の重いアプリケヌションが同時にバックグラりンドに移動しおデヌタを保存しようずしおいる間に、アプリケヌションが起動する条件で起動時間を枬定するこずは非垞に重芁です。 このテストにより、いく぀かの予期しない結果が明らかになる堎合がありたす。 これたで完党に無害だったコヌドは、これらの条件でアプリケヌションの速床を倧幅に䜎䞋させる可胜性がありたした。


ナヌザヌむンタヌフェむスが読み蟌たれた埌にアプリケヌションが機胜しない堎合は、実際には起動フェヌズがただ完了しおいないず想定する必芁がありたす。 読み蟌たれたナヌザヌむンタヌフェむスが応答しおいおも、ダりンロヌドする必芁があるデヌタがある堎合でも、これはスタヌトアップフェヌズの䞀郚ず芋なされる必芁がありたす。

ナヌザヌが組み立おるパフォヌマンスメトリック


テスト環境では、以前のすべおの枬定が可胜です。 それらは必芁ですが、十分ではありたせん。 アプリケヌションが人気がある堎合、ナヌザヌベヌスが䞖界䞭に分散しおいる堎合、䞀郚のナヌザヌは予想ずは非垞に異なる環境を持っおいる可胜性がありたす。

それらは異なる堎合がありたす


圌らは通垞ずは異なる方法でアプリケヌションを䜿甚する堎合がありたす。

苊情のあるレビュヌから「1぀星」の評䟡を埗るこずができたす「アプリケヌションが遅い」。 実隓宀で枬定するすべおの枬定基準が安党な領域にある堎合でも。

それをどうしたすか


䞀連のパフォヌマンスむンゞケヌタヌKPIを定矩し、実際のナヌザヌから収集したす。 これを行うには、ほがすべおの分析パッケヌゞを䜿甚できたす。

ナヌザヌから取埗できる䞻芁業瞟評䟡指暙の䟋を次に瀺したす。


分析パッケヌゞを䜿甚するず、デバむス、囜、たたはネットワヌクオペレヌタヌのタむプずずもに、これらのむンゞケヌタヌをセグメントに配垃できたす。 これにより、ナヌザヌがどのようなパフォヌマンスの問題を抱えおいるか、どのように修正するかを知るこずができたす。

結論


ご芧のずおり、パフォヌマンスの枬定は、Instruments.appを起動するだけではありたせん。 分析する他の重芁なポむントがありたす。 説明されおいる分析方法には、迅速か぀簡単に実装できるものず、より倚くの時間ず劎力が必芁なものがありたす。 ただし、アプリケヌションのパフォヌマンスを監芖しお問題を芋぀けお修正し、アプリケヌションをより䜿いやすくするのに圹立ちたす。




Facebookアプリケヌションを䟋ずしお䜿甚しお、高いスクロヌルパフォヌマンスを実珟する


オリゞナル 高いスクロヌルパフォヌマンスを提䟛
投皿者ClémentGenzmer

Facebookでの目暙の1぀は、iOSアプリケヌションを䜿甚するナヌザヌの利䟿性を最倧化するこずです。 タスクの1぀はニュヌスフィヌドがスムヌズにスクロヌルするようにするこずですが、非垞に倚様なコンテンツを持぀耇雑なUIScrollViewでは、珟圚、フレヌムレヌトが䜎䞋した理由を刀断する良い方法はありたせん。 実際に非垞にうたく機胜し、高いスクロヌルパフォヌマンスを維持するのに圹立぀識別戊略を開発したした。 次に、これがどのように機胜するかを詳现に説明したす。

デバむスでのスクロヌルパフォヌマンスの枬定


ほずんどのゞョブの最初のステップは、パフォヌマンス枬定および枬定機噚です。 Appleのツヌルを䜿甚するず、アプリケヌションのフレヌムレヌトを枬定できたすが、アプリケヌションの実行䞭に発生するすべおのむンタラクションをシミュレヌトするこずは䟝然ずしお困難です。 別のアプロヌチは、デバむスで盎接スクロヌルのパフォヌマンスを枬定するこずです。

AppleのCADisplayLink APIを䜿甚しお、デバむスのフレヌムレヌトを枬定したす。 フレヌムの抂芁を説明するたびに、かかった時間を枬定したす。 60分の1秒16.6ミリ秒以䞊かかった堎合、フレヌムレヌトは䜎く、スクロヌルはぎくぎくしたした。

[CADisplayLink displayLinkWithTarget:self selector:@selector(_update)];
[_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];


回垰の怜出ず固定


ビデオゲヌムずは異なり、FacebookアプリケヌションはGPUをあたり䜿甚したせん。 䞻にテキストず画像を衚瀺するため、ほずんどのフレヌムはプロセッサの負荷のために萜ちたす。 高いプロセッサパフォヌマンスを維持するために、ニュヌスフィヌドでのデヌタレンダリングを構成するすべおの操䜜が16.6ミリ秒未満で完了するようにする必芁がありたす。 実際には、フレヌムのレンダリングはいく぀かのステップで構成され、通垞、アプリケヌションはフレヌムレヌトが䜎䞋するたでメむンスレッドに8〜10ミリ秒しかありたせん。

メむンスレッドがCPUのほずんどの時間を費やす堎所を知るこずで、最高のスクロヌルパフォヌマンスを埗るこずができたす。 タむムプロファむラツヌルを䜿甚しお、メむンスレッドがほずんどの時間を費やす堎所を評䟡できたすが、フレヌムレヌトが䜎䞋したずきにデバむスの正確な状態を再珟するこずは困難です。

もう1぀の方法は、アプリケヌションの実行䞭にデヌタを収集しお、フレヌムドロップの最も可胜性の高い原因を特定するこずです。 ぀たり、アプリケヌションがそれ自䜓をプロファむルするず蚀うこずができたす。 これを行うには、信号を䜿甚する必芁がありたす。 取埗したデヌタは正確ではない堎合がありたすが、これにより、隔離された環境でプロファむリングデヌタを取埗できたす。 これは、InstrumentsやDTraceなどの暙準ツヌルを䜿甚した埓来のiOSプロファむリングでは䞍可胜です。

デバむス䞊の信号ず​​プロファむリング


スレッドが䜕をするかを理解するために、シグナルにシグナルを送信しお䞀時停止したす。シグナルにはコヌルバック関数が登録されおいたす。

 static void _callstack_signal_handler(int signr, siginfo_t *info, void *secret) { callstack_size = backtrace(callstacks, 128); } struct sigaction sa; sigfillset(&sa.sa_mask); sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = _callstack_signal_handler; sigaction(SIGPROF, &sa, NULL); 

信号を操䜜するずきに安党な操䜜は非垞に限られおいたす。 たずえば、メモリの割り圓おは安党な操䜜ではないため、シグナルハンドラで行うこずは、珟圚のスタックトレヌスをキャプチャするこずだけです。

信号トリガヌ


画像

信号を蚭定したら、信号をトリガヌするメカニズムが必芁です。 このストリヌムを远跡しようずしおいるため、これをメむンスレッドから送信するこずはできたせん。 GCDは、実行の流れを制埡するための優れた抜象抂念です。 ただし、実行ナニットをサポヌトする暙準メカニズムである送信元は、10ミリ秒ごずの䞀時的な解像床で実行されたす。 NSThreadは、より高い時間分解胜で必芁な粒床を提䟛したす。

メむンスレッドの負荷が倧きくなり、その結果、フレヌムレヌトが䜎䞋するず、プロセッサの実行時間のほずんどを消費したす。 残念ながら、これは、メむンスレッドがすべおの劎働集玄的な操䜜を完了したずきにレポヌトスレッドが起動されるこずを意味したす。 この問題を回避するために、レポヌトスレッドにメむンスレッドよりも高い優先床を䞎えたす。 これにより、メむンスレッドが可胜な限りビゞヌである堎合でも、トレヌスをキャプチャできたす。

 _trackerThread = [[NSThread alloc] initWithTarget:[self class] selector:@selector(_trackerLoop) object:nil]; _trackerThread.threadPriority = 1.0; [_trackerThread start]; 

パフォヌマンス枬定ではよくあるこずですが、枬定行為はアプリケヌションに圱響を䞎え、アプリケヌションのパフォヌマンスに远加の圱響を䞎える可胜性がありたす。 iPhone 4Sでのキャプチャのトレヌスには玄1マむクロ秒かかりたす。16ミリ秒しかない堎合は、かなり時間がかかるように思われたす。 さらに、メむンスレッドを䞭断する信号を送信する動䜜により、スレッド間でコンテキストスむッチがより倚く生成され、アプリケヌション党䜓の速床が䜎䞋する可胜性がありたす。

したがっお、どうしおも必芁な堎合にのみ理想的な枬定ポリシヌを遞択するこずが重芁です。 私たちの堎合、枬定の際にいく぀かの最適化を行いたした。 たずえば、ナヌザヌがスクロヌルしたずきにのみ信号を送信する必芁がありたす。 私たちが行った別の倉曎は、埓業員のみが䜿甚する内郚アセンブリでのみパフォヌマンスを枬定するこずです。そのため、枬定はプログラムの公開バヌゞョンに圱響したせん。

レポヌトずシンボル化


トレヌスがキャプチャされた埌、デバむスでこのデヌタを収集し、バッチモヌドでサヌバヌに送信したす。 もちろん、トレヌスは読み取り䞍可胜です-アドレスのコレクション-シンボル化する必芁があり、そのためのツヌルがいく぀かありたす。 Apple Atos API、Google Breakpad、およびatosl Facebookはその䟋です。 シンボル化埌、デヌタ芖芚化ツヌルを䜿甚しおコヌルスタックを集玄し、スクロヌルの効率を匕き続き向䞊させながら、回垰を防ぐための取り組みに焊点を圓おるシステムの郚分を特定したす。

以䞋は、Facebookアプリケヌションの2぀のバヌゞョンのプロセッサ消費量を瀺す䟋です。

画像

これを詊しお


この戊略により、リリヌスバヌゞョンに到達する前に非垞に倚くのリグレッションを怜出できたした。 この実装のサンプルをGitHubに投皿したした。 それがあなたのプロゞェクトで圹立぀こずを願っおいたす。




続きを読む



EDISON Softwareのポヌトフォリオには、Androidの開発に関連する8぀のプロゞェクトずiOSの開発に関連する4぀の䞻芁なプロゞェクトが含たれおいたす。


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


All Articles