Rendimiento de la aplicación

La biblioteca cliente de Google Ads para .NET simplifica las interacciones de tu aplicación 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 del rendimiento específicas para las apps de .NET y se complementan las prácticas recomendadas que se aplican de forma general 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:

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

Usa tokens de acceso de una cuenta a nivel de administrador siempre que sea posible

  • Si tienes un token de acceso emitido a nivel de una 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, luego, inicia 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 en comparación con 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 instancias de GoogleAdsClient. 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 versión 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 un perfil de tu app para el uso de CPU y memoria, y así identificar los cuellos de botella del rendimiento. Visual Studio proporciona herramientas de diagnóstico para ayudarte a generar perfiles de tu app. También hay otras herramientas comerciales de generación de perfiles disponibles.

Usa métodos asíncronos

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

Cancelación de métodos asíncronos

Puedes usar el parámetro callSettings 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.V21.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 Google Ads para .NET 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 seguir 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 las solicitudes específicas que te interesen y 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.

Cómo usar la opción ReadyToRun

.NET Core 3.1 agrega compatibilidad para precompilar tus archivos binarios en una plataforma y arquitectura específicas. Para ello, debes especificar un parámetro de configuración PublishReadyToRun en true y, luego, publicar el archivo binario especificando un RuntimeIdentifier válido durante la publicación. Consulta la guía sobre la función ReadyToRun para obtener más información.

Usa TieredCompilation

TieredCompilation permite que .NET identifique zonas críticas y mejore su rendimiento. La compilación por niveles funciona mejor con la opción ReadyToRun, ya que puede usar la imagen generada previamente 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 basura (GC): un perfil de estación de trabajo y un perfil de servidor. Estos dos perfiles tienen diferentes compensaciones de rendimiento. Las aplicaciones que usan la biblioteca de Google Ads para .NET suelen tener un mejor rendimiento cuando se ejecutan en un perfil de servidor. Puedes beneficiarte de ajustar la configuración de GC que se indica a continuación.

  • 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 proporcione 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 basura del servidor, agrega las siguientes líneas al archivo .csproj de tu app.

    <PropertyGroup>
      <ServerGarbageCollection>true</ServerGarbageCollection>
    </PropertyGroup>
    
  • Recolección simultánea de elementos no utilizados: Puedes activar la recolección simultánea de elementos no utilizados para asignarle al recolector de elementos no utilizados de .NET un subproceso exclusivo 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 de gran tamaño. Para activar la recolección de basura simultánea, agrega las siguientes líneas al archivo .csproj de tu app.

    <PropertyGroup>
      <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    </PropertyGroup>
    
  • Retain VM garbage collection: El parámetro de configuraciónRetainVMGarbageCollection 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 en el sistema operativo (SO). Puedes activar la retención de memoria virtual agregando las siguientes líneas a tu app.

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

Puedes ajustar la configuración de tu GC para 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 App.config de tu app del SDK de .NET.