Wydajność aplikacji

Biblioteka klienta Google Ads .NET upraszcza interakcje aplikacji z interfejsem Google Ads API przy minimalnej konfiguracji po Twojej stronie. 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 wydajności aplikacji .NET i uzupełnia sprawdzone metody, które mają ogólne zastosowanie w przypadku interfejsu Google Ads API.

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

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

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

W miarę możliwości używaj tokenów dostępu z konta na poziomie 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 wykorzystywaniem instancji GoogleAdsClient może to dodatkowo zmniejszyć liczbę rund, które biblioteka klienta musi wykonać, aby odświeżyć tokeny dostępu.

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

Funkcja GoogleAdsService.Search może wysyłać wiele żądań podzielonych na strony, aby pobrać cały raport, natomiast funkcja GoogleAdsService.SearchStream wysyła jedno żądanie i nawiązuje trwałe połączenie z interfejsem Google Ads API niezależnie od rozmiaru raportu. Eliminując czas potrzebny na wysłanie żądania do sieci i otrzymanie odpowiedzi dla każdej strony odpowiedzi Search, w zależności od aplikacji SearchStream może zapewnić większą wydajność niż stronicowanie. Więcej informacji o tej optymalizacji znajdziesz w artykule Wyszukiwanie a SearchStream.

Ręczne zarządzanie odświeżaniem tokena dostępu

W niektórych środowiskach, np. Google Cloud Functions, ponowne użycie instancji GoogleAdsClient może być niemożliwe. W takich środowiskach mogą obowiązywać własne sprawdzone metody przechowywania i ponownego wykorzystywania danych. W takich przypadkach możesz rozszerzyć klasę GoogleAdsConfig, aby samodzielnie odświeżać token 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 kompilacji do publikacji

Podczas wdrażania aplikacji na serwerze upewnij się, że kompilujesz ją za pomocą konfiguracji wersji. W przypadku konfiguracji Debug 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 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 unikać wąskich gardeł wydajności i zwiększać ogólną szybkość reakcji aplikacji. Biblioteka Google Ads .NET generuje metody asynchroniczne dla wszystkich usług i metod RPC.

Anulowanie metod asynchronicznych

Za pomocą parametru callSettings możesz przekazywać wartość 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.V20.GoogleAdsService);

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

Wyłącz rejestrowanie, gdy to możliwe

Biblioteka Google Ads .NET domyślnie wyłącza logowanie i korzysta z podejścia leniwego logowania, co zwiększa wydajność aplikacji. Jeśli włączysz rejestrowanie, pamiętaj, aby wyłączyć je w środowisku produkcyjnym. Jeśli chcesz monitorować konkretne żądania, które nie działają w wersji produkcyjnej, możesz wykonać co najmniej 1 z tych kroków bez negatywnego wpływu na wydajność aplikacji:

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

Więcej informacji znajdziesz w przewodniku po rejestrowaniu.

Decydowanie, czy użyć metody SearchStream czy Search

Interfejs Google Ads API udostępnia 2 główne sposoby pobierania obiektów: metoda Search (która korzysta z paginacji) i SearchStream (która korzysta ze strumieniowania).

SearchStream zapewnia lepszą wydajność niż Search, ale w niektórych przypadkach preferowane jest Search.

Więcej informacji o tych 2 metodach znajdziesz w przewodniku po raportach przesyłanych strumieniowo.

Używanie opcji ReadyToRun

.NET Core 3.1 dodaje obsługę wstępnej kompilacji plików binarnych na określoną platformę i architekturę przez ustawienie PublishReadyToRun na true, a następnie opublikowanie pliku binarnego przez określenie prawidłowego RuntimeIdentifier podczas publikowania. Więcej informacji znajdziesz w przewodniku po funkcji ReadyToRun.

Używanie TieredCompilation

TieredCompilation umożliwia platformie .NET identyfikowanie obszarów o dużym obciążeniu i poprawianie wydajności. Kompilacja warstwowa lepiej współpracuje z opcją ReadyToRun, ponieważ w razie potrzeby może używać wstępnie wygenerowanego obrazu. Więcej informacji znajdziesz w przewodniku na tematTieredCompilation.

Dostosowywanie czyszczenia pamięci

Platforma .NET udostępnia 2 ogólne profile odśmiecania: profil stacji roboczej i profil serwera. Te 2 profile mają różne kompromisy dotyczące wydajności. Aplikacje korzystające z biblioteki Google Ads .NET zwykle działają lepiej, gdy są uruchamiane w profilu serwera. Możesz skorzystać z precyzyjnego dostrajania tych ustawień GC.

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

    <PropertyGroup>
      <ServerGarbageCollection>true</ServerGarbageCollection>
    </PropertyGroup>
    
  • Równoczesne odśmiecanie pamięci: możesz włączyć równoczesne odśmiecanie pamięci, aby przydzielić 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. Możesz włączyć równoczesne odśmiecanie pamięci, dodając te wiersze do pliku .csproj aplikacji.

    <PropertyGroup>
      <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    </PropertyGroup>
    
  • Zachowaj odzyskiwanie pamięci wirtualnej: RetainVMGarbageCollectionustawienie określa, czy segmenty pamięci wirtualnej, które powinny zostać usunięte, są umieszczane na liście rezerwowej do wykorzystania w przyszłości, czy też są zwalniane z powrotem do systemu operacyjnego. Aby włączyć przechowywanie pamięci wirtualnej, dodaj do aplikacji te wiersze:

    <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 .NET SDK.