Google Ads .NET 客户端库可简化应用与 Google Ads API 的互动,您只需进行最少的配置。不过,整体性能在很大程度上取决于库的使用方式以及与应用的集成方式。
本指南介绍了特定于 .NET 应用的性能优化,并补充了通常适用于 Google Ads API 的最佳实践。
尽可能重复使用 GoogleAdsClient
GoogleAdsClient 表示用户在进行 API 调用时的会话。它提供以下优化:
- 缓存 API 服务使用的 gRPC 通道。这样可以缩短首次进行 API 调用时的设置时间。
- 尽可能重复使用访问令牌。这样可以减少 Google Ads .NET 客户端库为刷新访问令牌而必须执行的往返次数。
尽可能使用经理账号级账号的访问令牌
如果您拥有在经理账号级层级签发的访问令牌,则可以使用该令牌针对相应账号层次结构下的所有 Google Ads 客户账号进行 API 调用。
如果与重复使用 GoogleAdsClient 实例相结合,这可以进一步减少客户端库为刷新访问令牌而必须执行的往返次数。
尽可能使用 SearchStream 而不是 Search
Google Ads API 提供两种主要的对象检索方式:GoogleAdsService.Search(使用分页)和 GoogleAdsService.SearchStream(使用流式传输)。
虽然 Search 会发送多个分页请求来下载整个报告,但 SearchStream 只会发送一个请求,并与 Google Ads API 建立持久连接,而无论报告大小如何。通过消除请求 Search 响应的每个单独网页所需的往返网络时间,SearchStream 通常可以提供比分页更好的性能。如需详细了解何时选择每种方法,请参阅流式报告指南。
手动管理访问令牌刷新
在某些无状态环境中(例如 Google Cloud Functions),可能无法跨调用重复使用 GoogleAdsClient 实例。此类环境有自己的最佳实践来持久保存和重复使用数据。
在 Google.Ads.GoogleAds v27.0.0 及更高版本中,您可以使用 Credentials 属性直接在 GoogleAdsConfig 上注入预配置的 ICredential 实例,并停用渠道缓存 (UseChannelCache = false)。
如果您希望将凭据创建封装在自定义配置类中(或使用的是旧版库),则可以扩展 GoogleAdsConfig 类以执行自己的访问令牌刷新,如下所示:
// 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);
编译以生成发布 build
在部署到服务器时,请确保使用发布配置编译应用。使用调试配置时,您的应用会使用完整的符号调试信息进行编译,并且不会进行编译器优化。
分析应用性能
对应用的 CPU 和内存用量进行性能分析,以找出性能瓶颈。Visual Studio 提供诊断工具来帮助您分析应用。此外,还有其他商业分析工具可供使用。
使用异步方法
使用 async-await 范例进行异步编程有助于避免性能瓶颈,并提高应用的整体响应速度。Google Ads .NET 库会为所有服务和 RPC 方法生成异步方法。
异步方法取消
您可以使用 callSettings 参数将 CancellationToken 传递给异步方法,例如 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);
尽可能关闭日志记录功能
Google Ads .NET 库默认情况下会关闭日志记录,并使用延迟日志记录方法,从而提高应用性能。如果您在开发期间开启了日志记录,请务必在生产环境中将其关闭。如果您需要在正式版中监控特定失败的请求,可以执行以下一项或多项步骤,而不会对应用的性能产生不利影响:
- 仅开启摘要日志。
- 将完整日志设置为
ERROR级别。 - 保存特定失败请求的请求 ID,以便与支持渠道分享。
如需了解详情,请参阅日志记录指南。
使用 ReadyToRun 选项
新版 .NET 支持通过将 PublishReadyToRun 设置为 true,然后指定有效的 RuntimeIdentifier 来发布二进制文件,从而将二进制文件预编译到特定平台和架构。如需了解详情,请参阅ReadyToRun 部署指南。
使用 TieredCompilation
TieredCompilation(在 .NET 8 等新版 .NET 中默认处于启用状态)可让 .NET 识别热点并提升运行时性能。分层编译与 ReadyToRun 搭配使用效果很好,因为它可以利用预生成的映像快速启动,然后重新编译热方法并进行全面优化。如需了解详情,请参阅 TieredCompilation 指南。
微调垃圾回收 (GC)
.NET 为垃圾回收 (GC) 提供了两种常规配置文件:工作站配置文件和服务器配置文件。这两种配置在性能方面有不同的权衡取舍。使用 Google Ads .NET 库的专用服务器应用在服务器配置文件中运行时通常性能更好。
您可以微调以下 GC 设置,以从中获益:
服务器垃圾回收:服务器垃圾回收功能可让 .NET 运行时通过在多个 GC 堆和线程上运行,为 Google Ads API 应用提供更高的吞吐量。如需了解详情,请参阅服务器 GC 指南。您可以通过将以下代码行添加到应用的
.csproj文件中来开启服务器垃圾回收:<PropertyGroup> <ServerGarbageCollection>true</ServerGarbageCollection> </PropertyGroup>并发垃圾回收:您可以开启并发垃圾回收,以便为第 2 代中的垃圾回收提供专用线程。在处理大型报告时,此设置非常有用。您可以将以下代码行添加到应用的
.csproj文件中,以开启并发垃圾回收:<PropertyGroup> <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection> </PropertyGroup>保留虚拟机垃圾回收:
RetainVMGarbageCollection设置用于配置应删除的虚拟内存段是放入待机列表以供日后使用,还是释放回操作系统 (OS)。您可以通过将以下代码行添加到应用的.csproj文件中来开启虚拟内存保留:<PropertyGroup> <RetainVMGarbageCollection>true</RetainVMGarbageCollection> </PropertyGroup>
您可以选择平衡工作站和服务器行为的设置,从而对 GC 进行微调。您可以在 .NET 应用的 runtimeconfig.json 文件中、通过环境变量或在 App.config 中指定所有相关的 GC 设置。