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, o desempenho geral depende muito de como a biblioteca é usada e integrada ao app.

Este guia aborda as otimizações de performance específicas para apps .NET e complementa as práticas recomendadas que geralmente se aplicam à 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 de API iniciais.
  • Reutilizar tokens de acesso sempre que possível. Isso reduz o número de idas e voltas que a biblioteca de cliente do Google Ads para .NET 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 no nível de uma 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 de GoogleAdsClient, isso pode reduzir ainda mais o número de idas e voltas que a biblioteca de cliente precisa realizar para atualizar os tokens de acesso.

Use SearchStream em vez de Search sempre que possível

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

Enquanto Search envia várias solicitações paginadas para fazer o download de um relatório inteiro, 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, o SearchStream geralmente oferece um desempenho melhor do que a paginação. Consulte o guia de relatórios de streaming para saber quando escolher cada método.

Gerenciar manualmente as atualizações de tokens de acesso

Em determinados ambientes sem estado, como o Google Cloud Functions, talvez não seja possível reutilizar instâncias de GoogleAdsClient em invocações. Esses ambientes têm as próprias práticas recomendadas para persistir e reutilizar dados.

No Google.Ads.GoogleAds v27.0.0 e versões mais recentes, é possível injetar sua própria instância pré-configurada de ICredential diretamente em GoogleAdsConfig usando a propriedade Credentials e desativar o armazenamento em cache de canais (UseChannelCache = false).

Se você preferir encapsular a criação de credenciais em uma classe de configuração personalizada (ou estiver usando uma versão anterior da biblioteca), estenda a classe GoogleAdsConfig para realizar suas próprias atualizaçõ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 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);

Compilar para 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 de depuração simbólicas completas e sem otimizações do compilador.

Gerar um perfil do seu app

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

Usar métodos assíncronos

A programação assíncrona que usa o paradigma async-await ajuda a evitar gargalos de desempenho e melhora 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 para métodos assíncronos, como 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);

Desative a geração de registros quando puder

A biblioteca do Google Ads para .NET desativa a geração de registros por padrão e usa uma abordagem de geração de registros lenta que melhora o desempenho do app. Se você ativar a geração de registros durante o desenvolvimento, 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 o desempenho do app:

  • Ative apenas os registros de resumo.
  • Defina os registros completos como o nível ERROR.
  • Salve o ID de solicitações específicas com falha para compartilhar com os canais de suporte.

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

Usar a opção ReadyToRun

O .NET moderno é compatível com a pré-compilação de binários para uma plataforma e arquitetura específicas. Para isso, defina PublishReadyToRun como true e publique o binário especificando um RuntimeIdentifier válido. Consulte o guia de implantação do ReadyToRun para saber mais.

Usar TieredCompilation

TieredCompilation (ativado por padrão em versões modernas do .NET, como o .NET 8) permite que o .NET identifique pontos de acesso e melhore o desempenho do ambiente de execução. A compilação em camadas funciona bem com o ReadyToRun porque pode usar a imagem pré-gerada para uma inicialização rápida e, em seguida, recompilar métodos ativos com otimizações completas. Consulte o guia do TieredCompilation para saber mais.

Ajustar a coleta de lixo (GC, na sigla em inglês)

O .NET oferece dois perfis gerais para coleta de lixo (GC, na sigla em inglês): um perfil de estação de trabalho e um perfil de servidor. Esses dois perfis têm diferentes compensações de desempenho. Os apps de servidor dedicado que usam a biblioteca .NET do Google Ads geralmente têm uma performance melhor quando são executados em um perfil de servidor.

Você pode se beneficiar do ajuste das seguintes configurações de GC:

  • Coleta de lixo do servidor: permite que o ambiente de execução do .NET ofereça maior capacidade de processamento a um app da API Google Ads, operando em vários threads e heaps de GC. Consulte o guia de GC do servidor para mais detalhes. Para ativar a coleta de lixo do servidor, adicione 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 dar 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 grandes. Para ativar a coleta de lixo simultânea, adicione as seguintes linhas ao arquivo .csproj do app:

    <PropertyGroup>
      <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    </PropertyGroup>
    
  • Retenção da 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 arquivo .csproj do app:

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

É possível ajustar o GC escolhendo uma configuração que equilibre o comportamento da estação de trabalho e do servidor. Todas as configurações relevantes do GC podem ser especificadas no arquivo runtimeconfig.json do app .NET, por meio de variáveis de ambiente ou no App.config.