Xcodeでビルド速度を計測する

## はじめに
ビルド速度を調べたいことがあったので、そのときに知ったことを記事にします。
ビルド速度を測る方法はいくつかありますが、それぞれ取得できる情報は違ったりするので、その違いなども説明しつつ、測定方法を解説します。

## ビルドにかかった総時間だけを測りたいとき

ビルドログを見れば、ビルドにかかった総時間をみることができます。
以下手順で、Xcode でビルドログを確認できます。

### 1. Xcode の左の Navigator の上部タブの中から、ログのタブを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/9b0612c9-784d-445a-92ff-9f04caa04ed3.png)

過去〜現在のビルドログが一覧で表示されているので、測定したいビルドを選択する
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/027939b6-0b99-4426-8e3e-312d92b37e9d.png" />

::: note warn
DerivedData にビルドログが格納されているので、DerivedData の削除をしてしまうと過去のビルドログは見れなくなります。
:::

### 2. ビルドログを開くと、ログの最下部にビルドの総時間を確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/dd2c7a4b-d71d-48cb-9805-385f589b2d53.png)


## ビルドの各プロセス毎にどれぐらい時間かかかっているか測りたいとき

一言でビルドと言っても、その中でもいろんなことをやっています。
RunScript を実行したり、依存関係の検出、コンパイル、リンクなどいろんなプロセスを経て、ビルドが完了となっています。

::: note
ビルドで行われているプロセスの詳細は、[こちらの記事](https://wwdcnotes.com/documentation/wwdcnotes/wwdc18-415-behind-the-scenes-of-the-xcode-build-process/)で詳しく説明されていました。
:::

それら各プロセスでどれぐらい時間がかかっているかを計測するには、以下の手順で確認できます。

### 1. Xcode の上部のタブから"Product"を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/a461fcde-4c59-4bc4-ab54-d78812938fec.png)

### 2. "Perform Action" -> "Build with Timing Summary"を選択する。
これで、ビルドが開始されるので、ビルド完了までしばらく待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/282f9660-d655-4dff-82ec-eeaba33ce6a1.png)

ビルド完了したら、[ビルドにかかった総時間を測りたいとき](#ビルドにかかった総時間を測りたいとき)の確認手順と同様に、ビルドログを確認すると、最下部にビルド内の各プロセス毎の時間が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/3ee4d61a-dcfe-48ce-b8e6-1a41f5ceb4de.png)

### 使い所

この測定方法では、各ビルドプロセスの実行時間を、実行時間の降順で表示してくれるため、ビルド時間のボトルネックが直感的に確認することができます。
ビルド時間の高速化を検討しようとするときに、ボトルネックを探すための一次情報として優れていると思いました。
また、各リリースのタイミングなので、この情報を取得して、都度比較を行うことで、ビルド時間の悪化タイミングを早期に検知することもできそうです。

## もっと細かい粒度でビルド時間を測りたいとき

上述した測定よりも、もっと細かい粒度でビルド時間を測定する方法もあります。
あるライブラリのコンパイル時間を見れたりもします。
以下手順で、確認していきます。

### 1. ビルドログを確認する
[ビルドにかかった総時間を測りたいとき](#ビルドにかかった総時間を測りたいとき)の手順でビルドログを確認します。

### 2. タイムラインを表示
ビルドログを開いたら、ログの任意の箇所で右クリックして、"Show in Timeline"を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/3d366b5c-667e-49ee-b7ac-616906c65306.png)

すると、以下のようにビルドのタイムラインが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/0ed8bc88-a7a5-4403-a00f-9c5b0cd92312.png)

::: note info
"Show in Timeline"を行った位置にズームしてタイムラインが表示されるので、全体を見たい場合は、ズームアウトしてください。
:::

::: note warn
時々タイムラインが表示されなかったりするので、その際はXcodeの再起動で解消することがある。
それでもダメな場合は、ビルドしなおせば大体上手くタイムラインを表示できます。
:::

以下のように、タイムラインの上部にカーソルを合わせると、その時間に何が行われているか確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/2884c5c4-f732-442f-ac2a-2ee0e40accf9.png)

### 使い所

見てもらった通り、非常に大量のビルド時間に関わる情報を確認できます。
どのライブラリがビルドの遅延の原因なのかなどを知ることができるので、[ビルドの各プロセス毎にどれぐらい時間かかかっているか測りたいとき](#ビルドの各プロセス毎にどれぐらい時間かかかっているか測りたいとき)で解説した方法で、ボトルネックの箇所を確認した後、タイムラインでさらにボトルネックのプロセスの中でも、どのライブラリが悪さをしているのかなどを細かく確認するのに使用できそうです。

## おわり
以上が、ビルド時間の測定方法です。
Xcodeにこんな機能があったのは、結構長い間知らなかったので驚きでした。
これを活用すると、ビルド時間の高速化も捗りそうです。
もっと良い方法あれば、コメントいただけると幸いです。

### 参照

- https://wwdcnotes.com/documentation/wwdcnotes/wwdc18-415-behind-the-scenes-of-the-xcode-build-process/