Desempenho dos aplicativos

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

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

Reutilize 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:

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

Use tokens de acesso de uma conta de administrador sempre que possível

  • Se você tiver um token de acesso emitido em uma conta de administrador, poderá usá-lo para fazer chamadas de API em todas as contas de cliente do Google Ads na hierarquia da 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.

Use o SearchStream em vez da Pesquisa sempre que possível

Embora GoogleAdsService.Search possa enviar várias solicitações paginadas para fazer o download do relatório inteiro, 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 ida e volta da rede necessário para solicitar cada página individual de uma resposta Search, dependendo do seu app, o SearchStream pode oferecer um desempenho melhor em relação à paginação. Consulte Pesquisa versus SearchStream para saber mais sobre essa otimização.

Gerenciar manualmente as atualizações do token de acesso

Em alguns ambientes, como o Google Cloud Functions, pode não ser viável reutilizar instâncias do GoogleAdsClient. Esses ambientes podem ter práticas recomendadas próprias para manter e reutilizar dados. Nesses casos, é possível estender a classe GoogleAdsConfig para realizar suas próprias renovações de token 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

Compile o app usando a configuração de lançamento ao implantar no servidor. Ao usar a configuração de depuração, o app é compilado com informações completas de depuração simbólica e sem otimização.

Gerar um perfil do seu app

Crie um perfil do app para uso de CPU e memória para identificar gargalos de desempenho. O Visual Studio oferece ferramentas de diagnóstico para ajudar a criar o perfil do app. Também há outras ferramentas de criação de perfil comercial disponíveis.

Usar métodos assíncronos

A programação assíncrona usando o paradigma de espera assíncrona ajuda a evitar gargalos de desempenho e melhorar a capacidade de resposta geral do 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 parâmetro callSettings para transmitir um CancellationToken a 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.V19.GoogleAdsService);

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

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

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

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

Consulte o guia de registro para saber mais.

Decidir se você quer 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.

O SearchStream oferece melhor desempenho em relação ao Search, mas há situações em que o Search é a melhor opção.

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 pré-compilar seus binários em uma plataforma e arquitetura específica especificando uma configuração PublishReadyToRun como true e, em seguida, publicando o binário especificando um RuntimeIdentifier válido na publicação. Consulte o guia sobre o recurso ReadyToRun para saber mais.

Usar a TieredCompilation

O TieredCompilation permite que o .NET identifique pontos de acesso e melhore o desempenho. 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 fornece dois perfis gerais para a coleta de lixo (GC): um perfil de estação de trabalho e um perfil de servidor. Esses dois perfis têm trade-offs de performance diferentes. Os apps que usam a biblioteca .NET do Google Ads tendem a ter um desempenho melhor quando executados em um perfil de servidor. Você pode ajustar as seguintes configurações do GC.

  • Coleta de lixo do servidor:a coleta de lixo do servidor permite que o tempo de execução do .NET ofereça melhor desempenho a um app da API Google Ads ao operar 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 app.

    <PropertyGroup>
      <ServerGarbageCollection>true</ServerGarbageCollection>
    </PropertyGroup>
    
  • Coleta de lixo simultânea:é possível ativar a coleta de lixo simultânea para fornecer ao GC do .NET uma linha de execução dedicada para a 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 linhas a seguir ao arquivo .csproj do app.

    <PropertyGroup>
      <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    </PropertyGroup>
    
  • Manter a coleta de lixo da VM:a configuração RetainVMGarbageCollection define 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). Para ativar a retenção de memória virtual, adicione as seguintes linhas ao app.

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

É possível ajustar seu GC definindo uma configuração 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 do SDK do .NET.