La biblioteca cliente de Google Ads para .NET 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 usa la biblioteca y se integra en tu app.
En esta guía, se abordan las optimizaciones de rendimiento específicas de las apps para .NET y se complementan las prácticas recomendadas que se aplican generalmente a la API de Google Ads.
Reutiliza GoogleAdsClient siempre que sea posible
GoogleAdsClient
representa la sesión de un usuario cuando se realizan llamadas a la API. Proporciona optimizaciones como las siguientes:
- Almacenamiento en caché de los canales de gRPC que usan los servicios de API Esto reduce el tiempo de configuración cuando se realizan llamadas iniciales a la API.
- Reutilizar los tokens de acceso siempre que sea posible Esto reduce la cantidad 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 desde 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 de 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 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 todo el informe, 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 Search
, según tu app, SearchStream
podría ofrecer un rendimiento mejorado en comparación con la paginación. Consulta Búsqueda en comparación con SearchStream para obtener más información sobre esta optimización.
Cómo administrar manualmente las actualizaciones de tokens de acceso
En ciertos entornos, como Google Cloud Functions, es posible que no sea factible volver a usar instancias de GoogleAdsClient
. Estos entornos pueden tener 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);
Cómo compilar para una 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.
Cómo generar perfiles de tu app
Genera un perfil de tu app para el uso de la CPU y la memoria para identificar cuellos de botella de 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 disponibles.
Usa métodos asíncronos
La programación asíncrona con el paradigma async-await ayuda a evitar cuellos de botella de rendimiento y 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.V19.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 específicas que fallan 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 las 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 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 transmisiones para obtener más información sobre los dos métodos.
Usa la opción ReadyToRun
.NET Core 3.1 agrega compatibilidad para la compilación previa de tus objetos binarios en una plataforma y una 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 hagas. Consulta la guía sobre la función ReadyToRun
para obtener más información.
Usa TieredCompilation
TieredCompilation
permite que .NET identifique hotspots 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 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 Google Ads para .NET suelen tener un mejor rendimiento cuando se ejecutan en un perfil de servidor. Puedes beneficiarte de ajustar la siguiente configuración de GC.
Recopilació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 ofrezca 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>
Recopilación simultánea de elementos no utilizados: Puedes activar la recopilación simultánea de elementos no utilizados para darle a la GC 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 de gran tamaño. Para activar la recolección de basura simultánea, agrega las siguientes líneas al archivo
.csproj
de la app.<PropertyGroup> <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection> </PropertyGroup>
Retener la recolección de basura de la VM: La configuración
RetainVMGarbageCollection
determina 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 a tu app.<PropertyGroup> <RetainVMGarbageCollection>true</RetainVMGarbageCollection> </PropertyGroup>
Para ajustar mejor tu GC, puedes optar por una configuración que esté entre una estación de trabajo y un servidor. Toda la configuración relevante se especifica 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.