Rendimiento de la aplicación

La biblioteca cliente de .NET de Google Ads simplifica las interacciones de tu app con la API de Google Ads, con una configuración mínima de tu parte. Sin embargo, el rendimiento general depende en gran medida de cómo se use la biblioteca y de cómo se integre con tu app.

En esta guía, se abordan las optimizaciones de rendimiento que son específicas para las apps de .NET y se complementan las prácticas recomendadas que, por lo general, se aplican a la API de Google Ads.

Reutiliza GoogleAdsClient siempre que sea posible

GoogleAdsClient representa la sesión de un usuario cuando realiza llamadas a la API. Proporciona optimizaciones como las siguientes:

  • Almacenamiento en caché de los canales gRPC que usan los servicios de la API Esto reduce el tiempo de configuración cuando se realizan llamadas iniciales a la API.
  • Reutilización de tokens de acceso cuando sea posible Esto reduce la cantidad de viajes de ida y vuelta que la biblioteca cliente de .NET de Google Ads debe realizar para actualizar los tokens de acceso.

Usa tokens de acceso de una cuenta de administrador cuando sea posible

  • Si tienes un token de acceso emitido a nivel de la cuenta de administrador, puedes usarlo para realizar llamadas a la API en todas las cuentas de cliente de Google Ads que se encuentren en esa jerarquía de cuentas. Cuando se combina con la reutilización de instancias de GoogleAdsClient, esto puede reducir aún más la cantidad de viajes de ida y vuelta que la biblioteca cliente debe realizar para actualizar los tokens de acceso.

Usa SearchStream en lugar de Search siempre que sea posible

Si bien GoogleAdsService.Search puede enviar varias solicitudes paginadas para descargar el informe completo, GoogleAdsService.SearchStream envía una sola solicitud y establece una conexión persistente con la API de Google Ads, independientemente del tamaño del informe. Al eliminar el tiempo de red de ida y vuelta necesario para solicitar cada página individual de una respuesta de Search, según tu app, SearchStream podría ofrecer un mejor rendimiento que la paginación. Consulta Search versus SearchStream para obtener más información sobre esta optimización.

Administra manualmente las actualizaciones de tokens de acceso

En ciertos entornos, como Google Cloud Functions, es posible que no sea factible reutilizar GoogleAdsClient instancias. Estos entornos pueden incluir sus propias prácticas recomendadas para conservar y reutilizar datos. En esos casos, puedes extender la clase GoogleAdsConfig para realizar tus propias actualizaciones de tokens de acceso de la siguiente manera.

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

Compila para la compilación de lanzamiento

Asegúrate de compilar tu app con la configuración de lanzamiento cuando la implementes en el servidor. Cuando usas la configuración de depuración, tu app se compila con información de depuración simbólica completa y sin optimización.

Cómo generar perfiles de tu app

Genera perfiles de tu app para el uso de CPU y memoria para identificar cuellos de botella en el rendimiento. Visual Studio proporciona herramientas de diagnóstico para ayudarte a generar perfiles de tu app. También hay otras herramientas de generación de perfiles comerciales que están disponibles.

Usa métodos asíncronos

La programación asíncrona con el paradigma async-await ayuda a evitar cuellos de botella en el rendimiento y a mejorar la capacidad de respuesta general de tu app. La biblioteca de .NET de Google Ads genera métodos asíncronos para todos los servicios y métodos RPC.

Cancelación de métodos asíncronos

Puedes usar el callSettings parámetro para pasar un CancellationToken a métodos así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
);

Desactiva el registro cuando puedas

La biblioteca de .NET de Google Ads desactiva el registro de forma predeterminada y usa un enfoque de registro diferido que le brinda a tu app un mejor rendimiento. Si activas el registro, asegúrate de desactivarlo en el entorno de producción. Si necesitas supervisar solicitudes con errores específicos en producción, puedes realizar uno o más de los siguientes pasos sin afectar negativamente el rendimiento de tu app:

  • Activa solo los registros de resumen.
  • Establece los registros completos en el nivel ERROR.
  • Guarda el ID de solicitud para solicitudes específicas de interés que puedas compartir con los canales de asistencia.

Consulta la guía de registro para obtener más información.

Decide si usarás el método SearchStream o Search

La API de Google Ads proporciona dos formas principales de recuperar objetos: el método Search (que usa paginación) y SearchStream (que usa transmisión).

SearchStream proporciona un mejor rendimiento que Search, pero hay situaciones en las que se prefiere Search.

Consulta la guía de informes de transmisión para obtener más información sobre los dos métodos.

Usa la opción ReadyToRun

.NET Core 3.1 agrega compatibilidad para la precompilación de tus objetos binarios en una plataforma y arquitectura específicas. Para ello, especifica un parámetro de configuración PublishReadyToRun en true y, luego, publica el objeto binario especificando un RuntimeIdentifier válido cuando lo publiques. Consulta la guía sobre la ReadyToRun función para obtener más información.

Usa TieredCompilation

TieredCompilation permite que .NET identifique puntos de acceso y mejore su rendimiento. La compilación por niveles funciona mejor con la opción ReadyToRun, ya que puede usar la imagen pregenerada cuando está disponible. Consulta la guía sobre TieredCompilation para obtener más información.

Ajusta la recolección de elementos no utilizados (GC)

.NET proporciona dos perfiles generales para la recolección de elementos no utilizados (GC): un perfil de estación de trabajo y un perfil de servidor. Estos dos perfiles tienen diferentes compensaciones de rendimiento. Las apps que usan la biblioteca de .NET de Google Ads suelen tener un mejor rendimiento cuando se ejecutan en un perfil de servidor. Puedes beneficiarte de ajustar la siguiente configuración de GC.

  • Recolección de elementos no utilizados del servidor: La recolección de elementos no utilizados del servidor permite que el tiempo de ejecución de .NET brinde un mejor rendimiento a una app de la API de Google Ads, ya que opera en varios subprocesos. Consulta esta guía para obtener más detalles. Para activar la recolección de elementos no utilizados del servidor, agrega las siguientes líneas al archivo .csproj de tu app.

    <PropertyGroup>
      <ServerGarbageCollection>true</ServerGarbageCollection>
    </PropertyGroup>
    
  • Recolección de elementos no utilizados simultánea: Puedes activar la recolección de elementos no utilizados simultánea para darle a .NET GC un subproceso dedicado para la recolección de elementos no utilizados en la generación 2. Este parámetro de configuración puede ser útil cuando se procesan informes con tamaños grandes. Para activar la recolección de elementos no utilizados simultánea, agrega las siguientes líneas al archivo .csproj de tu app.

    <PropertyGroup>
      <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    </PropertyGroup>
    
  • Conservar la recolección de elementos no utilizados de la VM: El RetainVMGarbageCollection parámetro de configuración configura si los segmentos de memoria virtual que se deben borrar se colocan en una lista de espera para su uso futuro o se liberan de nuevo al sistema operativo (SO). Para activar la retención de memoria virtual, agrega las siguientes líneas a tu app.

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

Puedes ajustar tu GC con una configuración que se encuentre entre una estación de trabajo y un servidor. Todos los parámetros de configuración pertinentes se especifican en el archivo runtimeconfig.json de tu app de .NET Core, una variable de entorno o el archivo App.config de tu app del SDK de .NET.