Instruments
概要
Instruments とは、Xcode に付属しているパフォーマンス関連情報の収集・可視化・分析用ツールである。Instruments と言った時には、ツール自体である Instruments.app を指す場合の他に、Instruments から利用できるライブラリのことを指す場合もある。Instruments ライブラリは、アプリやプロセス、デバイスのさまざまな側面の情報のトレースを収集する。 Trace Document
計測を開始すると、計測内容を確認/分析するためのウインドウが表示され、計測の開始/停止もここから行える。計測終了後は結果を .trace ファイルとして保存しておくことができる。保存済みのファイルを開いた場合も同様のウインドウで内容を確認できる。
この時に扱う .trace ファイルは trace document と呼ばれる。あるいは、このファイルの保存前あるいは保存後に開いた時に表示されるウインドウを trace document ウインドウ と呼称する場合もあるらしい。このウインドウは、大きく 4 つのエリアに分けられる。
https://gyazo.com/af890f47b1c3035ed9072d282ab5eb2a
Toolbar
https://gyazo.com/3f97b9f1d9b5ec743eb10fffe87d6264
データ収集の開始/一時停止/停止が行える
プロファイル対象のデバイス, プロセスを指定できる
トレースの経過時間を確認できる
Instruments Library パレットを表示し、Trace Document に追加できる
Timeline pane
https://gyazo.com/655e023be78ae800178a0e637aeac12b
各 Instruments で収集されたデータが複数の Track (= 時系列のグラフ) で表示される
任意の Track を pin できる
Xcode 13+ では、Track の左端をクリックで pin の追加/削除が行える
表示するデータをフィルタリングすることもできる
CPUs: CPU コアと各コアの使用率を表示できる
Threads: スレッドと各スレッドの利用情報を表示できる
Instruments: 複数のInstruments Library で収集しているデータを表示できる
Detail pane
https://gyazo.com/f66b64648d5e2b9a037791efff241985
Navigation bar
データの表示形式の切り替えが行える
切り替えられる形式は Instruments によって異なる
例えば、サンプルした値をリスト表示するか?集計したものを表示するか?などを選択できる
Collected data area
選択した Instrument で収集されたデータが全て表示される
表示内容は Instruments によって異なる
Time Profiler の場合には Call Tree が表示される
Call Tree は、各メソッドが実行にかかった時間の合計を重みづけで確認できる
Filter and configuration bar
テキストフィールドでは、シンボル名で絞り込みが行える
https://gyazo.com/6aab741378c2cf4a210a45be5683d714
Call Tree をクリックすると、データの絞り込みなどを行える。以下の種類がある。
table:Call Tree
Separate by State App lifecycle state によってデータをグルーピングする
Separate by Thread スレッドによってデータをグルーピングする
Invert Call Tree Call Tree を反転して表示する
Hide System Libraries 自身のアプリのシンボルのみ表示する
Flatten Recursion Stack trace 内で再帰呼び出しがあればそれを取り除く
Top Functions ある関数実行にかかった時間に関数から呼び出された別関数の実行時間も合計する
Inspector pane
https://gyazo.com/cc52d7003976a158aa0549511e0141f7
Run Information area と Extended detail area を表示できる
Run information area
Detail pane に表示された実行に対して、target や計測時間、計測のための設定等の情報を表示する
Extended detail area
Detail pane で選択されたデータに対して、Instrument 特有の情報を表示する
例えば、完全なスタックトレースなど
テンプレート
概要
Instruments.app には、各種分析を行うための Instruments ライブラリ が含まれている。そして、これらの Instruments ライブラリの組み合わせを テンプレート と呼ぶ。標準で用意されているテンプレートには、例えば以下のようなものがある。
table:template
テンプレート 概要
Leaks メモリ使用率を可視化できる。メモリリークの発生も検知できる
Time Profiler CPU 使用率を可視化できる。スタックトレースから時間のかかっている関数を確認できる
Energy Log 各ハードウェアの状態を確認できる
カスタムテンプレート
テンプレートは自作することもでき、自作したテンプレートは下記の場所に保存される。逆に、下記の場所にテンプレートを配置すると、Instruments.app のテンプレート選択画面で参照できる。
code:text
~/Library/Application Support/Instruments/Templates
Trace document の内容をカスタムテンプレートとして保存し、後ほど別のアプリで同様の計測を行うことができる。trace document を開いた状態で File > Save As Template から、アイコンや名称、説明文を設定して保存ができる。
Instruments の使い方
計測の開始
Instruments は Xcode のメニュー (Xcode > Open Developer Tool > Instruments) から開始できるし、独立したアプリなので Spotlight 検索から起動することもできる。
Xcode の debug navigator から Instruments を起動することもできる。下図で示しているような赤枠で囲まれたボタンを押すと、Instruments を起動することができる。
https://gyazo.com/cc08fd499e857c2c1037903ba66a0c3c
https://gyazo.com/64b3d05c4a195fb8857f1eaa37dd2053
Allocations
Allocations で、メモリ割り当てについて調査できる
Allocations では、Generation Analysis が可能になっている
Detail pane の下部 bar から、Mark Generation を選択する
すると、赤いフラグがトラック上に表示される
赤いフラグが立った場所が1つの Generation として認識され、Detail pane でその時のメモリ割り当てを詳細に確認できる
さらに続けて Generation を追加すると、後続の Generation では、前の Generation との差分が確認できる
メモリが増えているのが本当にアプリの問題なのか?をチェックするために、意図的に Memory warning を起こすのも良い
Simulator のDebug > Simulate Memory Warning から実行できる
UIKit などのシステムによってメモリが確保されていた場合、解放される 参考