アプリケーションのパフォーマンス

Google Ads .NET クライアント ライブラリを使用すると、最小限の構成で、アプリと Google Ads API のやり取りを簡単に行うことができます。ただし、全体的なパフォーマンスは、ライブラリの使用方法とアプリとの統合方法に大きく依存します。

このガイドでは、.NET アプリに固有のパフォーマンス最適化について説明します。これは、Google Ads API に一般的に適用されるベスト プラクティスを補完するものです。

可能な限り GoogleAdsClient を再利用する

GoogleAdsClient は、API 呼び出しを行う際のユーザーのセッションを表します。次のような最適化が提供されます。

  • API サービスで使用される gRPC チャネルをキャッシュに保存する。これにより、最初の API 呼び出し時のセットアップ時間が短縮されます。
  • 可能な場合はアクセス トークンを再利用する。これにより、Google 広告 .NET クライアント ライブラリがアクセス トークンを更新するために行うラウンド トリップの回数を減らすことができます。

可能な場合は、マネージャー レベルのアカウントのアクセス トークンを使用する

  • MCC アカウント単位で発行されたアクセス トークンがある場合は、そのトークンを使用して、そのアカウント階層内のすべての Google 広告クライアント アカウントに対して API 呼び出しを行うことができます。GoogleAdsClient インスタンスの再利用と組み合わせることで、クライアント ライブラリがアクセス トークンを更新するために実行する必要があるラウンドトリップの数をさらに減らすことができます。

可能な限り Search ではなく SearchStream を使用する

GoogleAdsService.Search は複数のページネーション リクエストを送信してレポート全体をダウンロードできますが、GoogleAdsService.SearchStream は 1 つのリクエストを送信し、レポートのサイズに関係なく Google 広告 API との永続的な接続を開始します。Search レスポンスの各ページをリクエストするために必要なラウンドトリップ ネットワーク時間を排除することで、アプリによっては、SearchStream の方がページングよりもパフォーマンスが向上する可能性があります。この最適化について詳しくは、検索と SearchStream の比較をご覧ください。

アクセス トークンの更新を手動で管理する

Google Cloud Functions などの特定の環境では、GoogleAdsClient インスタンスの再利用が不可能な場合があります。このような環境には、データを保持して再利用する独自のベスト プラクティスが用意されている場合があります。そのような場合は、GoogleAdsConfig クラスを拡張して、次のように独自のアクセス トークンの更新を実行できます。

// Create your own config class by extending the GoogleAdsConfig class.

class MyGoogleAdsConfig : GoogleAdsConfig
{
    public MyGoogleAdsConfig() : base()
    {
        // Disable the library's in-built channel caching mechanism.
        this.UseChannelCache = false;
    }
    protected override ICredential CreateCredentials()
    {
        // TODO: Create your own ICredentials object here. You may refer to the
        // default implementation of GoogleAdsConfig::CreateCreateCredentials
        // for an example.
    }
}

// Use your own config class when initializing the GoogleAdsClient instance.

MyGoogleAdsConfig myconfig = new MyGoogleAdsConfig();
GoogleAdsClient client = new GoogleAdsClient(myconfig);

リリースビルド用にコンパイルする

サーバーにデプロイするときは、リリース構成を使用してアプリをコンパイルしてください。デバッグ構成を使用すると、アプリは完全なシンボリック デバッグ情報を使用してコンパイルされ、最適化は行われません。

アプリのプロファイリングを行う

CPU とメモリの使用量の両方についてアプリをプロファイリングして、パフォーマンスのボトルネックを特定します。Visual Studio には、アプリのプロファイリングに役立つ診断ツールが用意されています。その他の商用プロファイリング ツールも利用できます。

非同期メソッドを使用する

非同期処理の await パターンを使用した非同期プログラミングは、パフォーマンスのボトルネックを回避し、アプリの全体的な応答性を向上させます。Google 広告 .NET ライブラリは、すべてのサービスと RPC メソッドに対して非同期メソッドを生成します。

非同期メソッドのキャンセル

callSettings パラメータを使用して、CancellationToken を非同期メソッドに渡すことができます。

CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
cancellationTokenSource.CancelAfter(3000);
CallSettings callSettings = CallSettings.FromCancellationToken(cancellationTokenSource.Token);

string query = "SELECT campaign.name FROM campaign";
var request = new SearchGoogleAdsStreamRequest()
{
    CustomerId = customerId.ToString(),
    Query = query,
};

GoogleAdsServiceClient googleAdsService = client.GetService(
    Services.V19.GoogleAdsService);

googleAdsService.SearchStream(request,
    delegate (SearchGoogleAdsStreamResponse resp)
    {
        foreach (GoogleAdsRow googleAdsRow in resp.Results)
        {
            // Process the row.
        }
    }, callSettings
);

可能であればロギングをオフにする

Google 広告 .NET ライブラリは、デフォルトでロギングを無効にし、アプリのパフォーマンスを向上させる遅延ロギング アプローチを使用します。ロギングを有効にした場合は、本番環境でオフにしてください。本番環境で特定の失敗したリクエストをモニタリングする必要がある場合は、アプリのパフォーマンスに悪影響を与えることなく、次のいずれかまたは複数の手順を実施できます。

  • 概要ログのみを有効にします。
  • 完全なログを ERROR レベルに設定します。
  • サポート チャネルと共有できる特定のリクエストのリクエスト ID を保存します。

詳細については、ロギング ガイドをご覧ください。

SearchStream メソッドと Search メソッドのどちらを使用するかを決定する

Google Ads API には、オブジェクトを取得する主な方法が 2 つあります。Search メソッド(ページネーションを使用する)と SearchStream(ストリーミングを使用する)です。

SearchStreamSearch よりもパフォーマンスが優れていますが、Search が優先されるシナリオもあります。

これらの 2 つの方法について詳しくは、ストリーミング レポート ガイドをご覧ください。

ReadyToRun オプションを使用する

.NET Core 3.1 では、PublishReadyToRun 設定を true に指定してバイナリを特定のプラットフォームとアーキテクチャにプリコンパイルし、公開時に有効な RuntimeIdentifier を指定してバイナリを公開するサポートが追加されました。詳しくは、ReadyToRun 機能のガイドをご覧ください。

TieredCompilation を使用する

TieredCompilation を使用すると、.NET はホットスポットを特定してパフォーマンスを改善できます。階層型コンパイルは、利用可能な場合に事前生成されたイメージを使用できるため、ReadyToRun オプションで適切に機能します。詳しくは、TieredCompilation に関するガイドをご覧ください。

ガベージ コレクション(GC)を微調整する

.NET には、ガベージ コレクション(GC)用にワークステーション プロファイルとサーバー プロファイルの 2 つの一般的なプロファイルが用意されています。これらの 2 つのプロファイルには異なるパフォーマンスのトレードオフがあります。Google 広告 .NET ライブラリを使用するアプリは、サーバー プロファイルで実行するとパフォーマンスが向上する傾向があります。次の GC 設定を微調整すると、メリットがあります。

  • サーバー ガベージ コレクション: サーバー ガベージ コレクションにより、.NET ランタイムは複数のスレッドで動作して、Google Ads API アプリのパフォーマンスを向上させることができます。詳しくは、こちらのガイドをご覧ください。サーバー ガベージ コレクションを有効にするには、アプリの .csproj ファイルに次の行を追加します。

    <PropertyGroup>
      <ServerGarbageCollection>true</ServerGarbageCollection>
    </PropertyGroup>
    
  • 同時実行ガベージ コレクション: 同時実行ガベージ コレクションを有効にして、.NET GC に第 2 世代のガベージ コレクション専用のスレッドを割り当てることができます。この設定は、サイズの大きなレポートを処理する際に役立ちます。アプリの .csproj ファイルに次の行を追加すると、同時ガベージ コレクションを有効にできます。

    <PropertyGroup>
      <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    </PropertyGroup>
    
  • VM ガベージ コレクションを保持する: RetainVMGarbageCollection 設定では、削除する必要がある仮想メモリのセグメントをスタンバイ リストに入れて将来使用できるようにするか、オペレーティング システム(OS)に解放するかを構成します。仮想メモリの保持を有効にするには、アプリに次の行を追加します。

    <PropertyGroup>
      <RetainVMGarbageCollection>true</RetainVMGarbageCollection>
    </PropertyGroup>
    

ワークステーションとサーバーの間の設定に落ち着くことで、GC を微調整できます。関連するすべての設定は、.NET Core アプリの runtimeconfig.json ファイル、環境変数、または .NET SDK アプリの App.config で指定します。