Wydajność aplikacji

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

Ten przewodnik zawiera informacje o optymalizacji wydajności w przypadku aplikacji .NET i uzupełnia sprawdzone metody, które są ogólnie stosowane w przypadku interfejsu Google Ads API.

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

GoogleAdsClient reprezentuje sesję użytkownika podczas wywoływania interfejsu API. Umożliwia ona takie optymalizacje:

  • Buforowanie kanałów gRPC używanych przez usługi interfejsu API. Dzięki temu skrócisz czas konfiguracji podczas wykonywania początkowych wywołań interfejsu API.
  • W miarę możliwości używaj ponownie tokenów dostępu. Dzięki temu zmniejsza się liczba połączeń, które musi wykonać biblioteka klienta Google Ads .NET, aby odświeżyć tokeny dostępu.

W miarę możliwości używaj tokenów dostępu z poziomu konta menedżera.

  • Jeśli masz token dostępu wystawiony 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ę połączeń, które biblioteka klienta musi wykonać, aby odświeżyć tokeny dostępu.

W miarę możliwości używaj SearchStream zamiast Search.

Chociaż interfejs GoogleAdsService.Search może wysyłać wiele żądań po stronie, aby pobrać cały raport, interfejs GoogleAdsService.SearchStream wysyła pojedyncze żądanie i inicjuje trwałe połączenie z interfejsem Google Ads API niezależnie od rozmiaru raportu. Dzięki wyeliminowaniu czasu potrzebnemu na przelot w obie strony, który jest wymagany do przesłania każdej strony odpowiedzi Search, w zależności od aplikacji SearchStream może zapewnić większą wydajność niż pobieranie stron. Więcej informacji o tej optymalizacji znajdziesz w artykule Porównanie Search i SearchStream.

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

W niektórych środowiskach, takich jak Google Cloud Functions, ponowne użycie instancji GoogleAdsClient może nie być możliwe. Takie środowiska mogą mieć własne zalecane metody przechowywania i ponownego używania danych. W takich przypadkach 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 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);

Kompilowanie wersji do publikacji

Podczas wdrażania aplikacji na serwer skompiluj ją, używając konfiguracji wersji produkcyjnej. Gdy używasz konfiguracji debugowania, aplikacja jest kompilowana z pełnymi symbolicznymi informacjami debugowania i bez optymalizacji.

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 ułatwiają profilowanie aplikacji. Dostępne są też inne narzędzia do profilowania komercyjnego.

Używanie metod asynchronicznych

Programowanie asynchroniczne z użyciem paradygmatu async-await pomaga unikać wąskich gardeł związanych ze skutecznością i zwiększać ogólną responsywność aplikacji. Biblioteka Google Ads .NET generuje asynchroniczne metody dla wszystkich usług i metod RPC.

Anulowanie asynchronicznych metod

Parametru callSettings możesz użyć do przekazania parametru CancellationToken do metod asynchronicznych:

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
);

Wyłączanie rejestrowania, gdy to możliwe

Biblioteka Google Ads .NET domyślnie wyłącza rejestrowanie i użyje podejścia opartego na leniwym rejestrowaniu, które zapewnia lepszą wydajność aplikacji. Jeśli włączysz rejestrowanie, pamiętaj, aby wyłączyć je w środowisku produkcyjnym. Jeśli chcesz monitorować określone żądania, które nie udają się w wersji produkcyjnej, możesz wykonać co najmniej 1 z tych czynności, nie wpływając negatywnie na wydajność aplikacji:

  • Włącz tylko dzienniki podsumowania.
  • Ustaw pełne dzienniki na poziom ERROR.
  • Zapisz identyfikator żądania w przypadku konkretnych żądań, które możesz udostępnić kanałom pomocy.

Więcej informacji znajdziesz w przewodniku dotyczącym rejestrowania danych.

Decydowanie, czy użyć metody SearchStream czy Search

Interfejs Google Ads API udostępnia 2 główne sposoby pobierania obiektów: metodę Search (która korzysta z podziału na strony) i SearchStream (która korzysta ze strumieniowego przesyłania danych).

SearchStream zapewnia lepszą skuteczność niż Search, ale są też sytuacje, w których preferowany jest Search.

Więcej informacji o tych dwóch metodach znajdziesz w przewodniku po raportach dotyczących transmisji danych.

Korzystanie z opcji Gotowy do użycia

.NET Core 3.1 obsługuje wstępną kompilację plików binarnych na określoną platformę i architekturę. Aby to zrobić, należy ustawić parametr PublishReadyToRun na true, a następnie opublikować plik binarny, podając prawidłowy parametr RuntimeIdentifier. Więcej informacji znajdziesz w przewodniku dotyczącym funkcji ReadyToRun.

Używanie funkcji z poziomami

TieredCompilation pozwala .NET wykrywać obszary wymagające poprawy i poprawiać wydajność. Kompilacja wielopoziomowa działa lepiej z opcją ReadyToRun, ponieważ może użyć wstępnie wygenerowanego obrazu, jeśli jest dostępny. Więcej informacji znajdziesz w przewodnikuTieredCompilation.

Dostosowanie czyszczenia pamięci (GC)

.NET udostępnia 2 ogólne profile do zbierania elementów usuniętych z pamięci: profil stacji roboczej i profil serwera. Te 2 profile mają różne kompromisy dotyczące wydajności. Aplikacje korzystające z biblioteki .NET Google Ads zwykle działają lepiej w profilu serwera. Możesz dostosować te ustawienia GC.

  • Wywoływanie usuwania śmieci po stronie serwera: wywołanie usuwania śmieci po stronie serwera umożliwia środowisku wykonawczemu .NET zwiększenie wydajności aplikacji Google Ads API dzięki działaniu w wielu wątkach. Więcej informacji znajdziesz w tym przewodniku. Możesz włączyć zbieranie śmieci na serwerze, dodając te wiersze do pliku .csproj aplikacji.

    <PropertyGroup>
      <ServerGarbageCollection>true</ServerGarbageCollection>
    </PropertyGroup>
    
  • Równoległe usuwanie elementów z pamięci podręcznej: możesz włączyć równoległe usuwanie elementów z pamięci podręcznej, aby zapewnić .NET GC dedykowany wątek do usuwania elementów z pamięci podręcznej w generacji 2. To ustawienie może być przydatne podczas przetwarzania raportów o dużych rozmiarach. Możesz włączyć równoległe usuwanie elementów z pamięci podręcznej, dodając do pliku .csproj aplikacji te wiersze:

    <PropertyGroup>
      <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    </PropertyGroup>
    
  • Zachowaj zbieranie elementów nieużywanych z maszyny wirtualnej: to ustawienie RetainVMGarbageCollectionokreśla, czy segmenty pamięci wirtualnej, które powinny zostać usunięte, zostaną umieszczone na liście w stanie gotowości do wykorzystania w przyszłości, czy zostaną zwrócone do systemu operacyjnego. Możesz włączyć utrzymanie pamięci wirtualnej, dodając do aplikacji te wiersze kodu:

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

Możesz dostosować GC, wybierając konfigurację pośrednią między stacją roboczą a serwerem. Wszystkie odpowiednie ustawienia są określone w pliku runtimeconfig.json aplikacji .NET Core, zmiennej środowiskowej lub pliku App.config aplikacji pakietu SDK .NET.