Производительность приложения

Клиентская библиотека Google Рекламы .NET упрощает взаимодействие приложения с Google Ads API и требует минимальной настройки. Однако общая производительность во многом зависит от того, как библиотека используется и интегрируется с вашим приложением.

В этом руководстве рассказывается, как оптимизировать производительность приложений .NET. Оно дополняет рекомендации по работе с Google Ads API.

По возможности используйте GoogleAdsClient повторно

GoogleAdsClient представляет сеанс пользователя при вызовах API. Она позволяет:

  • Кеширование каналов gRPC, используемых сервисами API. Это позволяет сократить время настройки при выполнении первых вызовов API.
  • По возможности повторно используйте токены доступа. Это позволяет сократить количество циклов, которые клиентская библиотека Google Ads .NET должна выполнить для обновления токенов доступа.

По возможности используйте токены доступа из аккаунта уровня менеджера.

Если у вас есть токен доступа, выданный на уровне управляющего аккаунта, вы можете использовать его для вызовов API во всех клиентских аккаунтах Google Рекламы, которые находятся ниже в иерархии. В сочетании с повторным использованием экземпляров GoogleAdsClient это может ещё больше сократить количество циклов обмена данными, которые клиентская библиотека должна выполнить для обновления токенов доступа.

По возможности используйте SearchStream вместо Search

Google Ads API предоставляет два основных способа получения объектов: GoogleAdsService.Search (с разбивкой на страницы) и GoogleAdsService.SearchStream (с потоковой передачей).

В то время как Search отправляет несколько запросов с разбивкой на страницы, чтобы скачать весь отчет, SearchStream отправляет один запрос и инициирует постоянное подключение к Google Ads API независимо от размера отчета. Поскольку при использовании SearchStream не требуется время на отправку запроса и получение ответа для каждой отдельной страницы, как в случае с Search, этот метод обычно обеспечивает более высокую производительность. Подробнее о том, когда следует использовать каждый из методов, читайте в руководстве по потоковой передаче отчетов.

Как вручную управлять обновлением токенов доступа

В некоторых средах без сохранения состояния, например в Google Cloud Functions, повторное использование экземпляров GoogleAdsClient в разных вызовах может быть невозможным. В таких средах есть свои рекомендации по сохранению и повторному использованию данных.

В Google.Ads.GoogleAds v27.0.0 и более поздних версиях вы можете внедрить собственный предварительно настроенный экземпляр ICredential непосредственно в GoogleAdsConfig с помощью свойства Credentials и отключить кеширование каналов (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);

Компиляция конечной сборки

При развертывании на сервере убедитесь, что вы компилируете приложение с помощью конфигурации выпуска. При использовании конфигурации Debug приложение компилируется с полной символьной отладочной информацией и без оптимизации компилятора.

Профилирование приложения

Профилируйте приложение по использованию ЦП и памяти, чтобы выявить узкие места в производительности. В Visual Studio есть инструменты диагностики, которые помогают профилировать приложение. Также доступны другие коммерческие инструменты профилирования.

Используйте асинхронные методы

Асинхронное программирование с использованием парадигмы async-await помогает избежать проблем с производительностью и повышает общую скорость отклика приложения. Клиентская библиотека Google Рекламы .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.V26.GoogleAdsService);

await googleAdsService.SearchStreamAsync(
    request,
    (SearchGoogleAdsStreamResponse resp) =>
    {
        foreach (GoogleAdsRow googleAdsRow in resp.Results)
        {
            // Process the row.
        }
    },
    callSettings);

Отключите ведение журналов, когда это возможно

По умолчанию ведение журнала в библиотеке .NET для Google Рекламы отключено. В ней используется ленивое ведение журнала, которое повышает производительность приложения. Если вы включили ведение журнала во время разработки, не забудьте отключить его в рабочей среде. Если вам нужно отслеживать определенные неудачные запросы в рабочей версии, вы можете выполнить одно или несколько из следующих действий, не влияя на производительность приложения:

  • Включите только сводные журналы.
  • Установите для полных журналов уровень ERROR.
  • Сохраните идентификаторы конкретных запросов, которые не удалось выполнить, чтобы передать их в канал поддержки.

Подробную информацию вы найдете в руководстве по ведению журналов.

Используйте параметр ReadyToRun

Современные версии .NET поддерживают предварительную компиляцию двоичных файлов для определенной платформы и архитектуры. Для этого нужно задать для PublishReadyToRun значение true, а затем опубликовать двоичный файл, указав действительный RuntimeIdentifier. Дополнительную информацию можно найти в руководстве по развертыванию ReadyToRun.

Использовать TieredCompilation

TieredCompilation (включена по умолчанию в современных версиях .NET, например .NET 8) позволяет .NET выявлять проблемные места и повышать производительность во время выполнения. Многоуровневая компиляция хорошо работает с ReadyToRun, поскольку может использовать предварительно сгенерированный образ для быстрого запуска, а затем перекомпилировать часто используемые методы с полной оптимизацией. Подробнее о TieredCompilation…

Настройте сборку мусора

В .NET есть два основных профиля для сборки мусора: профиль рабочей станции и профиль сервера. Эти два профиля имеют разные компромиссы в отношении производительности. Приложения на выделенном сервере, использующие библиотеку .NET Google Рекламы, часто работают лучше, если запущены в профиле сервера.

Вы можете настроить следующие параметры GC:

  • Сборка мусора на сервере. Сборка мусора на сервере позволяет среде выполнения .NET повысить пропускную способность приложения Google Ads API за счет работы с несколькими кучами и потоками сборки мусора. Подробную информацию вы найдете в руководстве по сборке мусора на сервере. Чтобы включить сборку мусора на сервере, добавьте в файл .csproj приложения следующие строки:

    <PropertyGroup>
      <ServerGarbageCollection>true</ServerGarbageCollection>
    </PropertyGroup>
    
  • Параллельная сборка мусора. Вы можете включить параллельную сборку мусора, чтобы выделить для сборщика мусора .NET отдельный поток для сборки мусора в поколении 2. Эта настройка может быть полезна при обработке больших отчетов. Чтобы включить параллельную сборку мусора, добавьте в файл .csproj приложения следующие строки:

    <PropertyGroup>
      <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    </PropertyGroup>
    
  • Сохранять сборку мусора виртуальной машины. Параметр RetainVMGarbageCollection определяет, будут ли сегменты виртуальной памяти, которые должны быть удалены, помещены в список ожидания для дальнейшего использования или возвращены операционной системе (ОС). Чтобы включить сохранение виртуальной памяти, добавьте в файл .csproj приложения следующие строки:

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

Вы можете настроить сборщик мусора так, чтобы он работал как на рабочей станции, так и на сервере. Все необходимые настройки сборщика мусора можно задать в файле runtimeconfig.json приложения .NET, с помощью переменных среды или в файле App.config.