Signposts と Instruments でパフォーマンスを計測する:入門編


iOS アプリのパフォーマンスチューニングにおいて、Signposts を使用する方法について書きます。コード中に仕込んだ最も簡単なマーカーを Instruments で表示させるところまでを、初心者でも分かるように順を追って説明していきます。

Signposts とは

パフォーマンスを計測するためのマーカーで、Xcode 10 で導入されました。パフォーマンスを調査したいコード中にマーカーを入れて、プロファイリングすることにより、その計測結果を Instruments 上にグラフィカルに表示することができます。
自分の気になるところをフォーカスして解析できるので、パフォーマンスチューニングが捗るはかどると思います。

確認事項

Xcode 10 で導入されたものなので、iOS 12 以上でないと動きません。

マーカーの使い方

import os.signpost

まずは、os.signpost をインポートします。

let bootLog = OSLog(subsystem: "com.example.your-app", category: "BootOperations")

それから、計測したい箇所で、ログのハンドルを取得します。 subsystem にはアプリの Bundle ID などを適当に指定し、category はこのログのグループ名を自由に考えて指定します。ここでは、起動時のパフォーマンスを計測するとして、BootOperations と指定しています。

os_signpost(.begin, log: bootLog, name: "fetch something")
fetchSomething()
os_signpost(.end, log: bootLog, name: "fetch something")

最後に、作成したログのインスタンスを使いながら、計測したい箇所を os_signpost().begin.end で囲みます。ここでは、 fetchSomething() の時間を測り、 fetch something として表示するように設定しました。

計測方法

コードの準備が整ったら、実際に計測してみます。Instruments の Time Profiler を使う手順とほとんど同じなので、Time Profiler を使ったことがない人は、まず下記を参照して下さい。初めての人でも分かりやすくまとまっています。

Instruments Time Profiler の使い方
https://qiita.com/okamotoke/items/daac6645fc44daadf1dd

signpost を使うには、まず、Instruments を Time Profiler を選択して起動させます。

起動させたら、右上の「+」ボタンをクリックし、「Filter」のところで「sign」と入力すると、「os_signpost」が絞り込まれて表示されます。

この「os_signpost」をダブルクリックして追加します。

これで準備完了です。赤丸ボタンを押して計測をスタートし、マーカーを仕込んだコードが実行されたら、ストップしてみましょう。

無事に BootOperations グループの中で fetch something の実行時間が記録され、グラフィカルに表示することができました。

まとめ

Signposts の簡単なマーカーをコード中に仕込み、Instruments で表示させる方法を説明しました。Signposts ではさらにいろいろなことができるので、興味ある方は下記をご覧下さい。

Signposts と Instruments でパフォーマンスを計測する:基礎編
https://qiita.com/hsawada/items/1358ebc9aa1a82ac4f12

参考文献

Measuring Performance Using Logging
https://developer.apple.com/videos/play/wwdc2018/405

Xcode Time Profiler の使い方
https://qiita.com/okamotoke/items/daac6645fc44daadf1dd