Desempenho dos aplicativos

A biblioteca de cliente .NET do Google Ads simplifica as interações do seu app com a API Google Ads, com configuração mínima da sua parte. No entanto, a performance geral depende muito de como a biblioteca é usada e integrada ao seu app.

Este guia aborda otimizações de performance específicas para apps .NET e complementa as práticas recomendadas que geralmente são aplicáveis à API Google Ads.

Reutilizar o GoogleAdsClient sempre que possível

GoogleAdsClient representa a sessão de um usuário ao fazer chamadas de API. Ele oferece otimizações como:

  • Armazenamento em cache dos canais gRPC usados pelos serviços de API. Isso reduz o tempo de configuração ao fazer chamadas de API iniciais.
  • Reutilização de tokens de acesso quando possível. Isso reduz o número de viagens de ida e volta que a biblioteca de cliente .NET do Google Ads precisa realizar para atualizar os tokens de acesso.

Usar tokens de acesso de uma conta de administrador quando possível

  • Se você tiver um token de acesso emitido no nível da conta de administrador, poderá usá-lo para fazer chamadas de API em todas as contas de cliente do Google Ads na hierarquia dessa conta. Quando combinado com a reutilização de instâncias GoogleAdsClient, isso pode reduzir ainda mais o número de viagens de ida e volta que a biblioteca de cliente precisa realizar para atualizar os tokens de acesso.

Usar o SearchStream em vez do Search sempre que possível

Embora GoogleAdsService.Search possa enviar várias solicitações paginadas para fazer o download de todo o relatório, GoogleAdsService.SearchStream envia uma única solicitação e inicia uma conexão persistente com a API Google Ads, independentemente do tamanho do relatório. Ao eliminar o tempo de rede de ida e volta necessário para solicitar cada página individual de uma Search resposta, dependendo do seu app, SearchStream pode oferecer uma performance melhor do que a paginação. Consulte Search versus SearchStream para saber mais sobre essa otimização.

Gerenciar manualmente as atualizações de tokens de acesso

Em determinados ambientes, como o Google Cloud Functions, talvez não seja possível reutilizar GoogleAdsClient instâncias. Esses ambientes podem ter práticas recomendadas próprias para persistir e reutilizar dados. Nesses casos, é possível estender a classe GoogleAdsConfig para realizar suas próprias atualizações de tokens de acesso da seguinte maneira.

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

Compilar para o build de lançamento

Ao fazer a implantação no servidor, compile o app usando a configuração de Lançamento. Ao usar a configuração de depuração, o app é compilado com informações de depuração simbólicas completas e sem otimização.

Gerar um perfil do seu app

Gere um perfil do seu app para uso de CPU e uso da memória para identificar gargalos de performance. O Visual Studio oferece ferramentas de diagnóstico para ajudar a gerar um perfil do seu app. Há também outras ferramentas comerciais de criação de perfil que estão disponíveis.

Usar métodos assíncronos

A programação assíncrona usando o paradigma async-await ajuda a evitar gargalos de performance e melhora a capacidade de resposta geral do seu app. A biblioteca .NET do Google Ads gera métodos assíncronos para todos os serviços e métodos RPC.

Cancelamento de métodos assíncronos

É possível usar o callSettings parâmetro para transmitir um CancellationToken para métodos assíncronos:

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

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

Desativar a geração de registros quando possível

A biblioteca .NET do Google Ads desativa a geração de registros por padrão e usa uma abordagem de geração de registros lenta, o que oferece melhor performance ao seu app. Se você ativar a geração de registros, desative-a no ambiente de produção. Se você precisar monitorar solicitações com falha específicas na produção, siga uma ou mais das etapas abaixo sem afetar negativamente a performance do app:

  • Ative apenas os registros de resumo.
  • Defina os registros completos como nível ERROR.
  • Salve o ID da solicitação para solicitações específicas de interesse que você pode compartilhar com os canais de suporte.

Consulte o guia de geração de registros para saber mais.

Decidir se vai usar o método SearchStream ou Search

A API Google Ads oferece duas maneiras principais de recuperar objetos: o método Search (que usa paginação) e SearchStream (que usa streaming).

SearchStream oferece melhor performance do que Search, mas há cenários em que Search é preferível.

Consulte o guia de relatórios de streaming para saber mais sobre os dois métodos.

Usar a opção ReadyToRun

O .NET Core 3.1 adiciona suporte para a pré-compilação de binários em uma plataforma e arquitetura específicas, especificando uma configuração PublishReadyToRun como true e, em seguida, publicando o binário especificando um RuntimeIdentifier válido ao publicar. Consulte o guia sobre o ReadyToRun recurso para saber mais.

Usar TieredCompilation

TieredCompilation permite que o .NET identifique pontos de acesso e melhore a performance. A compilação em camadas funciona melhor com a opção ReadyToRun, já que ela pode usar a imagem pré-gerada quando disponível. Consulte o guia sobre TieredCompilation para saber mais.

Ajustar a coleta de lixo (GC)

O .NET oferece dois perfis gerais para coleta de lixo (GC): um perfil de estação de trabalho e um perfil de servidor. Esses dois perfis têm compensações de performance diferentes. Os apps que usam a biblioteca .NET do Google Ads tendem a ter uma performance melhor quando executados em um perfil de servidor. Você pode se beneficiar do ajuste das seguintes configurações de GC.

  • Coleta de lixo do servidor:a coleta de lixo do servidor permite que o ambiente de execução do .NET ofereça melhor performance a um app da API Google Ads operando em várias linhas de execução. Consulte este guia para mais detalhes. É possível ativar a coleta de lixo do servidor adicionando as seguintes linhas ao arquivo .csproj do seu app.

    <PropertyGroup>
      <ServerGarbageCollection>true</ServerGarbageCollection>
    </PropertyGroup>
    
  • Coleta de lixo simultânea: é possível ativar a coleta de lixo simultânea para dar ao .NET GC uma linha de execução dedicada para coleta de lixo na geração 2. Essa configuração pode ser útil ao processar relatórios com tamanhos grandes. É possível ativar a coleta de lixo simultânea adicionando as seguintes linhas ao arquivo .csproj do seu app.

    <PropertyGroup>
      <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    </PropertyGroup>
    
  • Manter a coleta de lixo da VM: a configuração RetainVMGarbageCollection configura se os segmentos de memória virtual que precisam ser excluídos são colocados em uma lista de espera para uso futuro ou são liberados de volta para o sistema operacional (SO). É possível ativar a retenção de memória virtual adicionando as seguintes linhas ao seu app.

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

É possível ajustar o GC definindo uma configuração que esteja entre uma estação de trabalho e um servidor. Todas as configurações relevantes são especificadas no arquivo runtimeconfig.json do app .NET Core, em uma variável de ambiente ou no App.config do app .NET SDK.