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 はスタンドアロン アプリケーションであり、IDE 内からプロファイリングを有効にするために、Visual Studio for Macおよび Visual Studio と統合されています。

プラットフォームのインストール パッケージをダウンロードします。

ダウンロードしたら、インストーラーを起動して、Xamarin 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 (Time Instrument はサポートされていません)
      • デバイスとシミュレーター
    • Mac
  • Visual Studio ( Enterprise バージョンのみ)

    • Android
      • デバイスとエミュレーター
    • iOS [試験段階]
      • デバイスとシミュレーター
    • tvOS
      • デバイスとシミュレーター

デバッグ構成のみをプロファイリングできることに注意してください。

Profiler の基本

このセクションでは、Xamarin Profiler の各部分について説明し、その機能について説明します。

アプリでプロファイリングを許可する

アプリを正常にプロファイルするには、アプリのプロジェクト オプションでプロファイリングを許可する必要があります。

  • iOS:

iOS デバッグ>のビルド > プロファイリングを有効にする

Visual Studio for Macの [iOS オプション] ダイアログ

  • Android:

Android デバッグ>のビルド>開発者インストルメンテーションを有効にする

Visual Studio for Macの [Android オプション] ダイアログ

プロファイラーの起動

Xamarin Profiler は、iOS または Android アプリケーションをプロファイリングするとき、またはスタンドアロン アプリケーションとして IDE から起動できます。

Visual Studio for Mac からの起動

  1. まず、アプリケーションがVisual Studio for Macに読み込まれていることを確認し、(既定の) デバッグ構成を選択します。
  2. 次の図に示すように、[Visual Studio for Macでプロファイルの開始を実行>する] または [Visual Studio で Xamarin Profiler を分析>する] を参照してプロファイラーを開きます。

Visual Studio for Macからプロファイラーを起動する

メニュー項目が表示されない場合は、 トラブルシューティング ガイドを参照してください。

これによりプロファイラーが起動し、アプリケーションのプロファイリングが自動的に開始されます。

プロファイラーを使用して、メモリとパフォーマンスを測定できます。 これを実現するには、Allocations と Time Profiler のインストルメントを使用します。これについては、次のセクションで詳しく説明します。

Profiler セッションの保存と読み込み

プロファイリング セッションをいつでも保存するには、[プロファイラー] メニュー バーから [ ファイル] > [名前を付けて保存 ] の順に選択します。 これにより、プロファイル データ用の特別な圧縮形式である mlpd 形式でファイルが保存されます。

インストール後、次のスクリーンショットに示すように、Xamarin Profiler は Applications フォルダーにあります。

Mac からスタンドアロン Profiler を開く

スタンドアロン アプリケーションを開き、[ターゲットの選択] を選択してファイルを読み込むことで、プロファイラーに .mlpd ファイルを読み込むことができます。

詳細については、「 .mlpd ファイルの生成」を参照してください。

プロファイラーの機能

Xamarin Profiler は、次に示すように 5 つのセクションで構成されます。

  • ツール バー – プロファイラーの上部に配置され、プロファイリングの開始/停止、ターゲット プロセスの選択、アプリの実行時間の表示、プロファイラー アプリケーションを構成する分割ビューの選択を行うオプションが用意されています。
  • インストルメントリスト – プロファイリングセッション用に読み込まれたすべてのインストルメントが一覧表示されます。
  • プロットチャート – これらのチャートは、インストルメントリスト内の関連するインストゥルメントに水平方向に関連付けます。 スライダー (Time Profiler の下に表示) を使用してスケールを変更できます。
  • [Instrument Detail]\(インストルメントの詳細\) 領域 - 現在の Instrument の選択したビューで表示されているデータが含まれます。 これらのビューの詳細については、以下のセクションを参照してください。
  • インスペクター ビュー – セグメント化されたコントロールで選択できるセクションが含まれます。 セクションは、選択したインストルメントに依存し、構成設定、統計、スタック トレース情報、ルートへのパスが含まれます。

割り当て

割り当てインストルメントは、作成中およびガベージ コレクション中のアプリケーション内のオブジェクトに関する詳細情報を提供します。

プロファイラーの上部には割り当てグラフがあり、プロファイリング中に一定の間隔で割り当てられたメモリの量が表示されます。 現在、割り当てグラフは割り当ての合計数であり、その時点でのヒープのサイズではありません。 ある意味では、それは決して下がることはありません、それは増えるだけです。 これには、スタックに割り当てられたオブジェクトが含まれます。 使用されるランタイム バージョンによっては、同じアプリであっても、グラフの外観が異なる場合があります。

Allocations インストルメントにはさまざまなデータ ビューがあり、開発者はアプリケーションがどのように使用されているかを分析し、メモリを解放できます。 これらのビューを次に示します。

  • 割り当て – すべての割り当ての一覧が表示され、クラス名でグループ化されます。 これにより、使用されているクラスとメソッド、使用される頻度、使用されるクラスの集合サイズの概要が示されます。 クラスをダブルクリックすると、割り当てられたメモリが表示されます。

割り当てのインスペクター ビューには、オブジェクトのフィルター処理とグループ化、割り当てられたメモリに関する統計、上位の割り当て、およびスタック トレースとルートへのパスのビューを提供するオプションが用意されています。

  • 呼び出しツリー – これにより、アプリケーション内のすべてのスレッドの呼び出しツリー全体が表示され、各ノードに割り当てられたメモリに関する情報が含まれます。 一覧で要素を選択すると、すべての兄弟ノードが灰色で表示されます。 ツリーを展開するか、要素をダブルクリックしてドリルダウンできます。 このデータ ビューを表示する場合は、表示設定インスペクター ビューを使用して表示方法を変更できます。 現在、次の 2 つのオプションがあります。
    1. 逆呼び出しツリー – これは、上から下へのスタック トレースを考慮します。 これは、CPU が時間を費やしてきた最も深い方法を示す便利なビュー オプションです。
    2. スレッドで区切る – このオプションは、呼び出しツリーをスレッド別に整理します。
  • スナップショット – このペインには、メモリ スナップショットに関する情報が表示されます。 ライブ アプリケーションのプロファイリング中にこれらを生成するには、保持および解放されているメモリを確認する各ポイントにあるツール バーの [カメラ ] ボタンをクリックします。 その後、各スナップショットをクリックして、内部で何が起こっているかを調べることができます。 スナップショットは、アプリをライブ プロファイリングする場合にのみ作成できることに注意してください。

Time Profiler

Time Profiler インストルメントは、アプリケーションの各メソッドで費やされた時間を正確に測定します。 アプリケーションは一定の間隔で一時停止され、スタック トレースはアクティブな各スレッドで実行されます。 [Instrument Detail]\(インストルメントの詳細\) 領域の各行には、フォローされている実行パスが表示されます。

次のスクリーンショットに示すように、プロット グラフには、アプリの実行時に受信したサンプルの数が表示されます。

  • コール ツリー – 各メソッドで費やされた時間を示します。

Cycles

C# と F# マネージ コードを使用すると、非常に一般的であり、残念ながら破棄されないオブジェクトへの参照を作成するのは非常に簡単です。 このインストルメントを使用すると、これらのオブジェクトを特定し、アプリケーションで参照されているサイクルを表示できます。

プロファイル アプリケーション

現時点では、既定のデバッグ構成のみをプロファイリングできます。

他の構成でアプリをプロファイリングする場合は、次のメッセージ ダイアログが表示されます。

[ 更新] を選択して続行します。

SGen ガベージ コレクターとプロファイリング

SGen ガベージ コレクターは、すべての Xamarin プラットフォームに使用されます。

SGen は世代別 GC であり、アプリケーションのオブジェクトを、幼稚園、メジャー ヒープ、ラージ オブジェクト空間の 3 つのヒープに割り当てます。 これにより、ガベージ コレクションを迅速に実行できます。 現在、SGen は Xamarin.Android および Xamarin.iOS 統合アプリケーションの既定の GC です。

クラシック API を使用する Xamarin.iOS アプリケーションでは、保守的な非世代ガベージ コレクターである Boehm GC を使用しました。 保守的であるため、使用可能なメモリを解放する可能性が低くなり、プロファイラーの使用時に不正確な結果が生じる可能性があります。 このため、Allocations インストルメントは、Boehm ガベージ コレクターでは使用できません。

アプリで Boehm GC を使用している場合はメッセージ ダイアログが表示されますが、Xamarin では、慎重な調査と徹底的なテストを行わずに、Boehm を使用する既存の iOS アプリケーションを SGen に切り替えることはお勧めしません。 Xamarin では、プロファイリングのために SGen に切り替えてから戻ることもお勧めしません。これらの結果では、メモリ使用量の正確なベンチマークが提供されないためです。

メモリ管理の詳細については、「 メモリとパフォーマンスのベスト プラクティス 」ガイドを参照してください。

まとめ

このガイドでは、プロファイリングとは何か、および開発者がどのような利点を持っているかを確認しました。 その後、Xamarin Profiler を導入し、そのしくみについていくつかの履歴と情報を提供しました。 最後に、Xamarin Profiler の機能について説明し、Allocations と Time Profiler Instruments について調べてみましょう。