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 cómo se integre en tu app.
En esta guía, se describen las optimizaciones de rendimiento específicas de las apps de .NET y se complementan las prácticas recomendadas que se aplican, en 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 la API. Esto reduce el tiempo de configuración cuando se realizan llamadas a la API iniciales.
- Reutilizar los tokens de acceso cuando sea posible Esto reduce la cantidad de viajes de ida y vuelta que debe realizar la biblioteca cliente de .NET de Google Ads para actualizar los tokens de acceso.
Usa tokens de acceso de una cuenta de nivel 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 debe realizar la biblioteca cliente 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
la paginación) y
GoogleAdsService.SearchStream
(que usa la 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. Como elimina el tiempo de ida y vuelta de la red
que se requiere para solicitar cada página individual de una respuesta de Search,
SearchStream suele ofrecer 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 los tokens de acceso
En ciertos entornos sin estado, como Google Cloud Functions, es posible que no sea factible reutilizar instancias de GoogleAdsClient en todas las 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é de canales (UseChannelCache = false).
Si prefieres encapsular la creación de credenciales en una clase de configuración personalizada (o 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 con el objetivo de 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 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 cuellos de botella en el rendimiento y mejora 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 de 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.V26.GoogleAdsService);
await googleAdsService.SearchStreamAsync(
request,
(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 mejora el rendimiento de tu app. Si activas el registro durante el desarrollo, asegúrate de desactivarlo en el entorno de producción. Si necesitas supervisar solicitudes con errores específicas en producción, puedes realizar uno o más de los siguientes pasos sin afectar de forma negativa 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 las solicitudes específicas que fallan, de modo 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 en una plataforma y
arquitectura específicas configurando PublishReadyToRun como true y, luego, publicando 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 (habilitada de forma predeterminada en las versiones modernas de .NET, como .NET 8)
permite que .NET identifique hotspots y mejore el rendimiento del entorno de ejecución. La compilación
por niveles funciona bien con ReadyToRun porque puede usar la imagen generada previamente
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 .NET de Google Ads suelen tener un mejor rendimiento cuando se ejecutan en un perfil de servidor.
Puedes beneficiarte de ajustar 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 de elementos no utilizados simultánea: Puedes activar la recolección de elementos no utilizados simultánea para darle al GC de .NET 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 grandes. Para activar la recolección de elementos no utilizados simultánea, agrega las siguientes líneas al archivo
.csprojde tu app:<PropertyGroup> <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection> </PropertyGroup>Retener la recolección de elementos no utilizados de la VM: El parámetro de configuración
RetainVMGarbageCollectionestablece si los segmentos de memoria virtual que se deben borrar se colocan en una lista de espera para su uso futuro o se devuelven al 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 tu GC eligiendo una configuración que equilibre el comportamiento de la estación de trabajo y
del 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.