Xamarin Profiler
このガイドでは、Xamarin Profiler の主な機能について説明します。 プロファイラー、プロファイリングとそれらを使用する必要があるタイミング、Xamarin アプリケーションをプロファイリングするための標準的なワークフローについて説明します。
アプリケーションの成功は、エンド ユーザー エクスペリエンスによって異なります。 開発者が、アプリに本当に素晴らしい機能を実装したところで、アプリの動作が遅かったり頻繁にクラッシュしたりするのでは、ユーザーはアプリを削除したくなるものです。
従来から Mono は、Mono ランタイムで実行されているプログラムに関する情報を収集するための強力なコマンド ライン プロファイラーを備えています。これは、Mono ログ プロファイラーと呼ばれます。 Xamarin Profiler は Mono ログ プロファイラーのグラフィカル インターフェイスであり、Mac 上の Android、iOS、tvOS、Mac アプリケーション、および Windows 上の Android、iOS、tvOS アプリケーションのプロファイリングをサポートします。
Xamarin Profiler には、プロファイリングに使用できる多数のインストルメント (割り当て、サイクル、タイム プロファイラー) があります。 このガイドでは、これらのインストルメントが測定する内容、アプリケーションの分析方法、各画面に表示されるデータの意味を説明します。
このガイドでは、一般的なプロファイリング シナリオについて説明し、iOS および Android アプリケーションの分析と最適化に役立つツールとしてプロファイラーを紹介します。
ダウンロードおよびインストールする
Note
Windows 用 Visual Studio Enterprise または Mac 用 Visual Studio for Mac のいずれかでこの機能のロックを解除するには、Visual Studio Enterprise のサブスクライバーである必要があります。
Xamarin Profiler はスタンドアロン アプリケーションであり、Visual Studio for Mac および Visual Studio と統合され、IDE 内からプロファイリングを有効にします。
プラットフォームのインストール パッケージをダウンロードします。
ダウンロードしたら、インストーラーを起動して、Xamarin Profiler をシステムに追加します。
Profiler とプロファイル
プロファイリングは、アプリケーション開発において重要であり、見過ごされることが多い手順です。 プロファイリングは、動的プログラム分析の一種であり、実行中および使用中のプログラムを分析します。 プロファイラーは、時間の複雑さ、特定のメソッドの使用状況、割り当てられているメモリに関する情報を収集するデータ マイニング ツールです。 プロファイラーを使用すると、これらのメトリックを詳細にドリルして分析し、コード内の問題領域を特定できます。
アプリケーションを設計および開発するときは、最適化を早い段階にし過ぎないことが重要です。つまり、ほとんどアクセスされない領域でコードの開発に時間を費やします。 ここでプロファイリングが効果を発揮します。 プロファイラーは、コード ベースで最もよく使用される部分に関する分析情報を提供し、改善に時間を費やす必要がある領域を特定するのに役立ちます。 開発者は、アプリケーションでほとんどの時間を費やした場所がどこかや、アプリケーションでのメモリの使用のされ方を理解するように注意を払う必要があります。
プロファイリングはすべての種類の開発で役立ちますが、モバイル開発では特に重要です。 最適化されていないコードは、デスクトップ コンピューターよりもモバイル プラットフォームで顕著であり、アプリの成功は、効率的に実行される美しく最適化されたコードにできるかどうかにかかっています。
Xamarin Profiler
Xamarin Profiler は、Visual Studio for Mac または Visual Studio 内からアプリケーションをプロファイリングする方法を開発者に提供します。 プロファイラーは、アプリに関する情報を収集して表示します。この情報は、開発者がアプリケーションの動作を分析するために使用できます。 Xamarin Profiler を使用してアプリケーションをプロファイリングする、つまりメモリ プロファイリングと統計サンプリングには、さまざまな方法があります。 これらは、割り当てとタイム プロファイラーの各インストルメントを通じて実行されます。
現時点では、Xamarin Profiler を使用して、Mac (Visual Studio for Mac を介して) 上で Xamarin.iOS、Xamarin.Android、Xamarin.Mac アプリケーションをテストできます。 プロファイラーは IDE とは別のプロセスであるため、Visual Studio for Mac から起動するだけでなく、スタンドアロン アプリケーションとして使用して、Mono ログ プロファイラーから生成された .exe と .mlpd
ファイルを調べることができます。
Profiler のサポート
Xamarin Profiler のサポートは、次のプラットフォームで利用できます。
Visual Studio for Mac (macOS、Enterprise ライセンス付き)
- Android
- デバイスとエミュレーター
- iOS
- デバイスとシミュレーター
- tvOS (タイム インストルメントはサポートされていません)
- デバイスとシミュレーター
- Mac
- Android
Visual Studio (Enterprise バージョンのみ)
- Android
- デバイスとエミュレーター
- iOS [試験段階]
- デバイスとシミュレーター
- tvOS
- デバイスとシミュレーター
- Android
デバッグ構成のみをプロファイリングできることに注意してください。
Profiler の基本
このセクションでは、Xamarin Profiler の各部分について説明し、その機能を紹介します。
アプリでのプロファイリングの許可
アプリを正常にプロファイリングするには、アプリのプロジェクト オプションでプロファイリングを許可する必要があります。
- iOS:
[ビルド] > [iOS のデバッグ] > [プロファイルを有効にする]
- Android:
[ビルド] > [Android のデバッグ] > [開発者インストルメンテーションを有効にします]
Profiler の起動
Xamarin Profiler は、iOS または Android アプリケーションをプロファイリングするとき、またはスタンドアロン アプリケーションとして IDE から起動できます。
Visual Studio for Mac からの起動
- まず、アプリケーションが Visual Studio for Mac に読み込まれていることを確認し、(既定の) デバッグ構成を選択します。
- 次の図に示すように、Visual Studio for Mac で[実行] > [プロファイルの開始] を参照するか、Visual Studio で [分析] > [Xamarin Profiler] を参照し、Profiler を開きます。
メニュー品目が表示されない場合は、トラブルシューティング ガイドをご覧ください。
これにより Profiler が起動し、アプリケーションのプロファイリングが自動的に開始されます。
Profiler を使用して、メモリとパフォーマンスを測定できます。 これを実現するには、割り当てとタイム プロファイラーのインストルメントを使用します。これについては、次のセクションで詳しく説明します。
Profiler セッションの保存と読み込み
プロファイル セッションをいつでも保存するには、[ファイル] >[名前を付けて保存] を [Profiler] メニュー バーから選択します。 これにより、ファイルは mlpd 形式で保存されます。これは、プロファイル データ用の特殊な高圧縮形式です。
インストールが完了すると、次のスクリーンショットに示すように、Xamarin Profiler が Applications フォルダーに表示されます。
.mlpd ファイルを Profiler に読み込みます。これには、スタンドアロン アプリケーション開き、[ターゲットの選択] を選択してファイルを読み込みます。
詳細については、「.mlpd ファイルの生成」をご覧ください。
Profiler の機能
Xamarin Profiler は、次に示すように 5 つのセクションで構成されています。
- ツール バー - プロファイラーの上部にあるこのオプションでは、プロファイリングの開始と停止、ターゲット プロセスの選択、アプリの実行時間の表示、プロファイラー アプリケーションを構成する分割ビューの選択を行うことができます。
- インストルメント リスト - プロファイル セッション用に読み込まれたすべてのインストルメントが一覧表示されます。
- プロット チャート - これらのチャートは、インストルメント リスト内の関連する機器に水平方向に関連付けられます。 スライダー (タイム プロファイラーの下に表示) を使用してスケールを変更できます。
- [Instrument Detail]\(インストルメントの詳細\) 領域 - 現在のインストルメントの選択したビューによって表示されるデータが含まれます。 これらのビューについては、以下のセクションで詳しく説明します。
- Inspector ビュー - セグメント化されたコントロールで選択できるセクションが含まれます。 セクションは選択したインストルメントに依存し、構成設定、統計、スタック トレース情報、ルートへのパスが含まれます。
割り当て
割り当てインストルメントは、アプリケーション内のオブジェクトが作成され、ガベージ コレクションが行われるときに、そのオブジェクトに関する詳細情報を提供します。
プロファイラーの上部には、プロファイリング中に一定の間隔で割り当てられたメモリの量が表示される割り当てグラフがあります。 現在、割り当てグラフは割り当ての合計数であり、その時点でのヒープのサイズではありません。 ある意味では、下がることはなく、上がっていくだけです。 これには、スタックに割り当てられたオブジェクトが含まれます。 使用されるランタイム バージョンによっては、同じアプリであっても、グラフの外観が異なる場合があります。
割り当てインストルメントにはさまざまなデータ ビューがあり、開発者はアプリケーションがどのように使用されているかを分析し、メモリを解放することができます。 これらのビューについては、以下で説明します。
- 割り当て - すべての割り当ての一覧が、クラス名でグループ化されて表示されます。 これにより、使用されているクラスとメソッド、使用される頻度、使用されるクラスの集合的なサイズの概要が示されます。 クラスをダブルクリックすると、割り当てられたメモリが表示されます。
割り当ての Inspector ビューには、オブジェクトのフィルター処理とグループ化、割り当てられたメモリに関する統計情報、上位の割り当て、およびスタック トレースとルートへのパスのビューを提供するためのオプションが用意されています。
- 呼び出しツリー - アプリケーション内のすべてのスレッドの呼び出しツリー全体が表示され、各ノードに割り当てられたメモリに関する情報が含まれます。 一覧で要素を選択すると、すべての兄弟ノードが灰色で表示されます。 ツリーを展開するか、要素をダブルクリックしてドリルダウンできます。 このデータ ビューを表示する場合、表示設定インスペクター ビューを使用して表示方法を変更できます。 現在、次の 2 つのオプションがあります。
- 逆呼び出しツリー - スタック トレースを上から下の順で検討します。 これは、CPU が時間を費やしてきた最下層のメソッドを示す便利なビュー オプションです。
- [Separate by thread]\(スレッドで区切る\) - このオプションは、スレッドごとに呼び出しツリーを整理します。
- スナップショット - このウィンドウには、メモリ スナップショットに関する情報が表示されます。 ライブ アプリケーションのプロファイリング中にこれらを生成するには、どのメモリが保持および解放されているかを見るための各ポイントにあるツール バーの [カメラ] ボタンをクリックします。 その後、各スナップショットをクリックして、内部で何が起こっているかを調べることができます。 スナップショットは、アプリのライブ プロファイリング時にのみ作成できることに注意してください。
タイム プロファイラー
タイム プロファイラー インストルメントは、アプリケーションの各メソッドに費やされた時間を正確に測定します。 アプリケーションは一定の間隔で一時停止され、アクティブな各スレッドでスタック トレースが実行されます。 [Instrument Detail]\(インストルメントの詳細\) 領域の各行には、実行パスが表示されます。
次のスクリーンショットに示すように、プロット グラフには、実行中にアプリが受け取ったサンプルの数が表示されます。
- 呼び出しツリー - 各メソッドに費やされた時間を示します。
サイクル
C# と F# マネージ コードを使用すると、破棄されることがないオブジェクトへの参照が作成されるのは、極めて普通であり、残念ながら頻繁に起きることです。 このインストルメントを使用すると、これらのオブジェクトを特定し、アプリケーションで参照されているサイクルを表示できます。
アプリケーションのプロファイリング
現時点では、既定のデバッグ構成のみをプロファイリングできます。
他の構成でアプリをプロファイリングする場合は、次のメッセージ ダイアログが表示されます。
[更新] を選択して続行します。
SGen ガベージ コレクターとプロファイル
SGen ガベージ コレクターは、すべての Xamarin プラットフォームで使用されます。
SGen は世代別 GC であり、アプリケーションのオブジェクトを、新世代、メジャー ヒープ、ラージ オブジェクト空間の 3 つのヒープに割り当てます。 これにより、ガベージ コレクションを迅速に実行できます。 現在、SGen は Xamarin.Android および Xamarin.iOS Unified アプリケーションの既定の GC です。
Classic API を使用する Xamarin.iOS アプリケーションでは、保守的な非世代別ガベージ コレクターである Boehm GC が使用されていました。 これは保守的であるため、使用可能なメモリを解放する可能性が低く、プロファイラーの使用時に不正確な結果が生じる可能性があります。 この理由から、割り当てインストルメントは、Boehm ガベージ コレクターでは使用できません。
アプリで Boehm GC を使用するとメッセージ ダイアログが表示されますが、Xamarin では、慎重な調査と徹底的なテストを行わずに、Boehm を使用する既存の iOS アプリケーションを SGen に切り替えることはお勧めしません。 Xamarin では、プロファイリングのために SGen に切り替えた後で、戻すことはお勧めしません。これらの結果に、メモリ使用量の正確なベンチマークが提供されないためです。
メモリ管理の詳細については、「メモリとパフォーマンスのベスト プラクティス」ガイドをご覧ください。
まとめ
このガイドでは、プロファイリングとは何か、および開発者にとってはどのような利点があるかについて説明しました。 その後、Xamarin Profiler を導入し、そのしくみについていくつかの履歴と情報を提供しました。 最後に、Xamarin Profiler の機能について説明し、割り当てとタイム プロファイラーのインストルメントについて説明しました。