Wydajność aplikacji

Biblioteka klienta Google Ads dla języka .NET upraszcza interakcje aplikacji z interfejsem Google Ads API, wymagając przy tym minimalnej konfiguracji. Ogólna wydajność zależy jednak w dużej mierze od sposobu używania biblioteki i jej integracji z aplikacją.

Ten przewodnik zawiera informacje o optymalizacji skuteczności aplikacji .NET i uzupełnia sprawdzone metody, które mają ogólne zastosowanie do interfejsu Google Ads API.

W miarę możliwości używaj ponownie GoogleAdsClient

GoogleAdsClient reprezentuje sesję użytkownika podczas wywoływania interfejsu API. Zapewnia optymalizacje takie jak:

  • buforowanie kanałów gRPC używanych przez usługi interfejsu API; Skraca to czas konfiguracji podczas wykonywania początkowych wywołań interfejsu API.
  • W miarę możliwości używaj ponownie tokenów dostępu. Zmniejsza to liczbę operacji w obie strony, które biblioteka klienta .NET Google Ads musi wykonać, aby odświeżyć tokeny dostępu.

Jeśli to możliwe, używaj tokenów dostępu z poziomu konta menedżera.

Jeśli masz token dostępu wydany na poziomie konta menedżera, możesz go używać do wywoływania interfejsu API na wszystkich kontach klientów Google Ads w hierarchii tego konta. W połączeniu z ponownym użyciem instancji GoogleAdsClient może to jeszcze bardziej zmniejszyć liczbę operacji w obie strony, które biblioteka klienta musi wykonać, aby odświeżyć tokeny dostępu.

Jeśli to możliwe, używaj SearchStream zamiast Search.

Interfejs Google Ads API udostępnia 2 główne sposoby pobierania obiektów: GoogleAdsService.Search (który korzysta ze stronicowania) i GoogleAdsService.SearchStream (który korzysta ze strumieniowania).

Search wysyła wiele żądań z podziałem na strony, aby pobrać cały raport, natomiast SearchStream wysyła jedno żądanie i inicjuje trwałe połączenie z interfejsem Google Ads API niezależnie od rozmiaru raportu. Dzięki wyeliminowaniu czasu przesyłu sieciowego w obie strony potrzebnego na przesłanie żądania każdej strony odpowiedzi Search SearchStream zwykle zapewnia lepszą wydajność niż stronicowanie. Więcej informacji o tym, kiedy wybrać daną metodę, znajdziesz w przewodniku po raportach strumieniowych.

Ręczne zarządzanie odświeżaniem tokenów dostępu

W niektórych środowiskach bezstanowych, takich jak Google Cloud Functions, ponowne używanie instancji GoogleAdsClient w różnych wywołaniach może nie być możliwe. Takie środowiska mają własne sprawdzone metody utrwalania i ponownego wykorzystywania danych.

W Google.Ads.GoogleAds v27.0.0 i nowszych możesz wstrzykiwać własną wstępnie skonfigurowaną instancję ICredential bezpośrednio do GoogleAdsConfig za pomocą właściwości Credentials i wyłączyć buforowanie kanału (UseChannelCache = false).

Jeśli wolisz hermetyzować tworzenie danych logowania w niestandardowej klasie konfiguracji (lub używasz starszej wersji biblioteki), możesz rozszerzyć klasę GoogleAdsConfig, aby samodzielnie odświeżać tokeny dostępu w ten sposób:

// Create your own config class by extending the GoogleAdsConfig class.
class MyGoogleAdsConfig : GoogleAdsConfig
{
    public MyGoogleAdsConfig() : base()
    {
        // Disable the library's built-in channel caching mechanism.
        UseChannelCache = false;
    }

    protected override ICredential CreateCredentials()
    {
        // Create your own ICredential object here. You may refer to the
        // default implementation of GoogleAdsConfig.CreateCredentials
        // for an example.
    }
}

// Use your own config class when initializing the GoogleAdsClient instance.
MyGoogleAdsConfig myConfig = new MyGoogleAdsConfig();
GoogleAdsClient client = new GoogleAdsClient(myConfig);

Kompilowanie do publikacji

Pamiętaj, aby podczas wdrażania na serwerze skompilować aplikację przy użyciu konfiguracji wersji. Podczas korzystania z konfiguracji debugowania aplikacja kompiluje się z pełnymi symbolicznymi informacjami na potrzeby debugowania i bez optymalizacji kompilatora.

Profilowanie aplikacji

Profiluj aplikację pod kątem wykorzystania procesora i pamięci, aby zidentyfikować wąskie gardła wydajności. Visual Studio udostępnia narzędzia diagnostyczne, które pomagają profilować aplikację. Dostępne są też inne komercyjne narzędzia do profilowania.

Używanie metod asynchronicznych

Programowanie asynchroniczne z użyciem paradygmatu async-await pomaga uniknąć wąskich gardeł i zwiększa ogólną szybkość działania aplikacji. Biblioteka .NET Google Ads generuje metody asynchroniczne dla wszystkich usług i metod RPC.

Anulowanie metod asynchronicznych

Możesz użyć parametru callSettings, aby przekazać CancellationToken do metod asynchronicznych, takich jak SearchStreamAsync:

using 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.V26.GoogleAdsService);

await googleAdsService.SearchStreamAsync(
    request,
    (SearchGoogleAdsStreamResponse resp) =>
    {
        foreach (GoogleAdsRow googleAdsRow in resp.Results)
        {
            // Process the row.
        }
    },
    callSettings);

Wyłączanie rejestrowania, gdy jest to możliwe

Biblioteka .NET Google Ads domyślnie wyłącza logowanie i stosuje podejście leniwego logowania, które zwiększa wydajność aplikacji. Jeśli włączysz logowanie podczas programowania, pamiętaj, aby wyłączyć je w środowisku produkcyjnym. Jeśli musisz monitorować konkretne nieudane żądania w środowisku produkcyjnym, możesz wykonać co najmniej 1 z tych czynności bez negatywnego wpływu na wydajność aplikacji:

  • Włącz tylko logi podsumowania.
  • Ustaw pełne logi na poziom ERROR.
  • Zapisz identyfikator żądania w przypadku konkretnych nieudanych żądań, aby móc go udostępnić w sposób kontaktu z zespołem pomocy.

Więcej informacji znajdziesz w przewodniku po logowaniu.

Używanie opcji ReadyToRun

Nowoczesny .NET obsługuje wstępną kompilację plików binarnych na potrzeby konkretnej platformy i architektury przez ustawienie PublishReadyToRun na true, a następnie opublikowanie pliku binarnego przez określenie prawidłowego RuntimeIdentifier. Więcej informacji znajdziesz w przewodniku po wdrażaniu ReadyToRun.

Użyj TieredCompilation

TieredCompilation (domyślnie włączona w nowoczesnych wersjach .NET, takich jak .NET 8) umożliwia .NET identyfikowanie hotspotów i poprawianie wydajności środowiska wykonawczego. Kompilacja wielopoziomowa dobrze współpracuje z ReadyToRun, ponieważ może używać wstępnie wygenerowanego obrazu do szybkiego uruchamiania, a następnie rekompilować często używane metody z pełną optymalizacją. Więcej informacji znajdziesz w przewodniku po TieredCompilation.

Dostosowywanie czyszczenia pamięci (GC)

.NET udostępnia 2 ogólne profile czyszczenia pamięci: profil stacji roboczej i profil serwera. Te 2 profile mają różne kompromisy dotyczące wydajności. Aplikacje na serwerach dedykowanych, które korzystają z biblioteki .NET Google Ads, często działają lepiej, gdy są uruchamiane w profilu serwera.

Możesz dostosować te ustawienia GC:

  • Odzyskiwanie pamięci serwera: odzyskiwanie pamięci serwera umożliwia środowisku wykonawczemu .NET zwiększenie przepustowości aplikacji interfejsu Google Ads API przez działanie na wielu stertach i wątkach odzyskiwania pamięci. Więcej informacji znajdziesz w przewodniku po GC serwera. Aby włączyć odzyskiwanie pamięci na serwerze, dodaj te wiersze do pliku .csproj aplikacji:

    <PropertyGroup>
      <ServerGarbageCollection>true</ServerGarbageCollection>
    </PropertyGroup>
    
  • Współbieżne odśmiecanie pamięci: możesz włączyć współbieżne odśmiecanie pamięci, aby zapewnić modułowi odśmiecania pamięci .NET dedykowany wątek do odśmiecania pamięci w generacji 2. To ustawienie może być przydatne podczas przetwarzania dużych raportów. Aby włączyć równoczesne odzyskiwanie pamięci, dodaj te wiersze do pliku .csproj aplikacji:

    <PropertyGroup>
      <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    </PropertyGroup>
    
  • Zachowaj czyszczenie pamięci maszyny wirtualnej: ustawienie RetainVMGarbageCollection określa, czy segmenty pamięci wirtualnej, które powinny zostać usunięte, są umieszczane na liście oczekujących do wykorzystania w przyszłości, czy są zwracane do systemu operacyjnego. Możesz włączyć przechowywanie pamięci wirtualnej, dodając te wiersze do pliku .csproj aplikacji:

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

Możesz dostosować GC, wybierając konfigurację, która równoważy zachowanie stacji roboczej i serwera. Wszystkie odpowiednie ustawienia GC można określić w pliku runtimeconfig.json aplikacji .NET, za pomocą zmiennych środowiskowych lub w pliku App.config.