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

Google Ads .NET クライアント ライブラリを使用すると、アプリと Google Ads API のやり取りが簡素化され、ユーザー側の構成を最小限に抑えることができます。ただし、全体的なパフォーマンスは、ライブラリの使用方法やアプリとの統合方法に大きく左右されます。

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

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

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

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

可能な場合は、MCC アカウントのアクセス トークンを使用する

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

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

GoogleAdsService.Search は、レポート全体をダウンロードするために複数のページ分割されたリクエストを送信できますが、GoogleAdsService.SearchStream は、レポートのサイズに関係なく、単一のリクエストを送信して Google Ads API との永続的な接続を開始します。Search レスポンスの各ページをリクエストするために必要なネットワークの往復時間を排除することで、アプリによっては、SearchStream はページングよりもパフォーマンスが向上する可能性があります。この最適化について詳しくは、Search と 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 には、アプリのプロファイリングに役立つ診断ツールが用意されています。また、他の商用プロファイリング ツールも利用できます。

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

async-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.V21.GoogleAdsService);

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

可能な場合はロギングをオフにする

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

  • 概要ログのみをオンにします。
  • 完全なログを 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 で指定します。