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:
- Almacenar en caché los canales de gRPC que usan los servicios de API Esto reduce el tiempo de configuración cuando se realizan llamadas a la API iniciales.
- Reutilizar tokens de acceso cuando 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 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
La API de Google Ads proporciona dos formas principales de recuperar objetos:
GoogleAdsService.Search (que usa paginación) y
GoogleAdsService.SearchStream
(que usa transmisión).
Mientras que Search envía varias solicitudes paginadas para descargar un informe completo, 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 ida y vuelta de la red necesario para solicitar cada página individual de una respuesta Search, SearchStream generalmente ofrece un mejor rendimiento que la paginación. Consulta la guía de informes de transmisión para obtener más información sobre cuándo elegir cada método.
Administra manualmente las actualizaciones de tokens de acceso
En ciertos entornos sin estado, como Google Cloud Functions, es posible que no sea factible reutilizar instancias de GoogleAdsClient en diferentes invocaciones.
Estos entornos tienen sus propias prácticas recomendadas para conservar y reutilizar datos.
En Google.Ads.GoogleAds v27.0.0 y versiones posteriores, puedes insertar tu propia instancia de ICredential preconfigurada directamente en GoogleAdsConfig con la propiedad Credentials y, luego, inhabilitar el almacenamiento en caché del canal (UseChannelCache = false).
Si prefieres encapsular la creación de credenciales en una clase de configuración personalizada (o si usas una versión anterior de la biblioteca), 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 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);
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 optimizaciones del compilador.
Cómo generar perfiles de tu app
Genera un perfil 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 ayudar 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 mejora 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 RPC.
Cancelación de métodos asíncronos
Puedes usar el parámetro callSettings para pasar un CancellationToken a métodos así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.V25.GoogleAdsService);
await googleAdsService.SearchStreamAsync(
request,
(SearchGoogleAdsStreamResponse resp) =>
{
foreach (GoogleAdsRow googleAdsRow in resp.Results)
{
// Process the row.
}
},
callSettings);
Desactiva el registro cuando puedas
De forma predeterminada, la biblioteca de Google Ads para .NET desactiva el registro y usa un enfoque de registro diferido que le brinda a tu aplicación un mejor rendimiento. Si activas el registro durante el desarrollo, 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 fallaron para que puedas compartirlo con los canales de asistencia.
Consulta la guía de registro para obtener más información.
Usa la opción ReadyToRun
.NET moderno admite la precompilación de tus objetos binarios para una plataforma y arquitectura específicas. Para ello, debes configurar PublishReadyToRun en true y, luego, publicar el objeto binario especificando un RuntimeIdentifier válido. Consulta la guía de implementación de ReadyToRun para obtener más información.
Usa TieredCompilation
TieredCompilation (habilitado de forma predeterminada en las versiones modernas de .NET, como .NET 8) permite que .NET identifique los hotspots y mejore el rendimiento del tiempo de ejecución. La compilación por niveles funciona bien con ReadyToRun porque puede usar la imagen pregenerada para un inicio rápido y, luego, volver a compilar los métodos activos con optimizaciones completas.
Consulta la guía de 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 de servidor dedicado que usan la biblioteca de Google Ads para .NET suelen tener un mejor rendimiento cuando se ejecutan en un perfil de servidor.
Puedes beneficiarte del ajuste de los siguientes parámetros de configuración de GC:
Recolección de elementos no utilizados del servidor: La recolección de elementos no utilizados del servidor permite que el entorno de ejecución de .NET proporcione una mayor capacidad de procesamiento a una app de la API de Google Ads, ya que opera en varios montones y subprocesos de GC. Consulta la guía de GC del servidor para obtener más detalles. Para activar la recolección de elementos no utilizados del servidor, agrega las siguientes líneas al archivo
.csprojde 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 asignar al recolector de elementos no utilizados de .NET un subproceso dedicado a 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 grandes. Para activar la recolección de basura simultánea, agrega las siguientes líneas al archivo
.csprojde tu app:<PropertyGroup> <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection> </PropertyGroup>Retain VM garbage collection: El parámetro de configuración
RetainVMGarbageCollectionconfigura 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). Para activar la retención de memoria virtual, agrega las siguientes líneas al archivo.csprojde tu app:<PropertyGroup> <RetainVMGarbageCollection>true</RetainVMGarbageCollection> </PropertyGroup>
Puedes ajustar la configuración de GC eligiendo una configuración que equilibre el comportamiento de la estación de trabajo y el servidor. Todos los parámetros de configuración de GC pertinentes se pueden especificar en el archivo runtimeconfig.json de tu app de .NET, a través de variables de entorno o en tu App.config.