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

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

  1. Быстрая загрузка данных
  2. Эффективные расчеты
  3. Сведение к минимуму необходимых ресурсов

Каждая из этих областей имеет несколько общих неблагоприятных шаблонов.

Быстрая загрузка данных

Следуйте этим рекомендациям, чтобы добиться быстрой загрузки приложений.

Избегайте прямого заполнения коллекции большими объемами данных

Иногда авторы используют ClearCollect() для копирования данных с сервера в коллекцию в своем приложении. Эта практика является обходным решением для ограничений делегирования в источнике или из-за того, что они планируют использовать коллекции в приложении для других целей. Использование ClearCollect() потенциально может увеличить скорость работы приложения при дальнейшем использовании коллекции. Однако при его реализации важно проявлять осторожность. Использование ClearCollect таким образом может привести к замедлению загрузки приложения или при навигации между страницами. ClearCollect() должен завершиться, прежде чем вы сможете увидеть данные в коллекции или таблице. Этот шаг может занять много времени, если данных много или вы используете этот подход для слишком большого количества источников данных. Коллекции лучше всего использовать в ситуациях, когда данные невелики и вам нужно выполнить много вычислений с коллекцией. Например, хорошее применение коллекций — это корзина онлайн-заказа. Клиент может обновить и удалить элементы несколько раз, прежде чем принять решение об оформлении заказа. Кроме того, вы можете пополнить коллекцию дополнительными элементами данных, такими как потенциальные скидки, основные моменты и т. д. К данным, доступным только для чтения, следует обращаться изначально, без внесения их в коллекцию.

Подумайте о том, чтобы не вызывать Power Automate для заполнения коллекции

Эта проблема представляет собой небольшую вариацию предыдущего раздела. Иногда авторы также используют Power Automate для заполнения своей коллекции Power Apps. В плане производительности для создания экземпляра Power Automate требуется около 0,6 секунды. Power Automate должен запускаться независимо каждый раз при его вызове. Он должен выделить память, разместить нужные компоненты и быть готовым к работе. Как и в случае с приведенным выше советом, один или два вызова Power Automate могут не стать проблемой в зависимости от вашего приложения. Но почти всегда худшие по производительности приложения злоупотребляют этим подходом. Затраты в отношении производительности могут быстро возрасти и ухудшить производительность вашего приложения.

Избегайте использования методов SaveData() и LoadData() в полностью автономном сценарии

Некоторые авторы используют ClearCollect(), а затем SaveData() для хранения данных для общего использования в автономном режиме. Вы можете использовать SaveData(), чтобы сохранить коллекцию на свое устройство, и LoadData(), чтобы загрузить ее, когда вы находитесь в автономном режиме. Однако этот подход не рекомендуется использовать в случаях, когда имеется большой объем данных или если данные сложные. Это замедляет работу вашего приложения, поскольку ему приходится ждать завершения работы ClearCollect(), прежде чем оно сможет отобразить данные. Вам следует использовать SaveData() и LoadData() только для небольших и простых сценариев данных, таких как настройки и короткие списки. Лучший способ работать с большими объемами данных в автономном режиме — использовать функцию автономного режима Power Apps, которая работает с Dataverse. Эта функция позволяет более эффективно обрабатывать большие и сложные данные.

Использование явного выбора столбцов

Явный выбор столбцов включен по умолчанию. Однако некоторые авторы отключают эту функцию. Проблема заключается в том, что при включенном явном выборе столбца (ECS) столбцы иногда не извлекаются из источника данных, если данные сначала извлекаются в коллекцию. Поскольку в некоторых таблицах может быть много столбцов, ECS автоматически вычисляет, какие столбцы необходимо получить, исходя из их использования в элементах управления (например, галереях и формах). Поскольку в некоторых таблицах может быть много столбцов, уменьшение размера загружаемого файла может повысить производительность. Некоторые таблицы могут иметь сотню столбцов и более. Если вашему приложению нужно использовать только 10 столбцов, и вы принимаете все столбцы из таблицы со 100 столбцами, вы принимаете в десять раз больше данных, чем вам действительно нужно.

Большинство проблем возникает при внесении данных в коллекции. Если в элементе управления есть явная ссылка на столбец, ECS работает хорошо. И ECS обычно работает для коллекций. Однако происхождение столбцов иногда теряется, когда данные перемещаются через коллекции и переменные. И поэтому Power Apps может потерять столбец, который должен получить. Чтобы решить эту проблему, вы можете заставить Power Apps «запомнить» столбец с помощью функции ShowColumns. Например:

    ClearCollect(
        MyColTable, 
        ShowColumns(Filter(BankAccounts, AcountNo = 32),
        "Col1", 
        "Col2", 
        "Col3")
    );

Где Col1, Col2 и Col3 — это столбцы, которые вы ожидаете получить из источник данных (например, источник данных Account).

Альтернативно вы можете добавить в форму скрытый элемент управления, который ссылается на столбец. Это заставляет Power Apps «запомнить» столбец.

Быстрые вычисления

Быстрые (или эффективные) вычисления сами по себе являются целью повышения производительности. Дополнительную информацию см. в разделе Быстрые (эффективные) вычисления. Однако есть некоторые распространенные неблагоприятные шаблоны, которые также могут повлиять на загрузку приложения, поэтому мы обсуждаем их здесь. Ниже приведен список оптимизаций, которые следует учитывать и которые могут повлиять на запуск приложения или навигацию по страницам.

Использование App.Formulas

Исторически многие авторы помещали в OnStart большое количество вычислений. Когда вы помещаете выражение в OnStart, оно заставляет Power Apps запускать это выражение точно при запуске приложения и до всего остального. Однако с появлением App.Formulas вы можете позволить Power Apps самому решать, когда запускать выражение. Power Apps может запустить формулу «точно в срок» до того, как она понадобится. Для получения дополнительной информации см. Формулы приложения. Используйте App.Formulas, чтобы разделить формулу на части, которые Power Apps может более эффективно организовать для выполнения.

Использование Concurrent

Используйте функцию Concurrent, чтобы разрешить одновременное выполнение формул. Эту функцию часто используют для заполнения коллекций, поскольку она допускает параллельное выполнение. Хотя это может обеспечить некоторое незначительное ускорение, добавление большого количества источников данных может вызвать проблемы с синхронизацией и регулированием количества запросов.

Использование улучшенной производительности для скрытых элементов управления

Если включено по умолчанию во всех новых приложениях, созданных после декабря 2022 года, Power Apps не отображает никаких элементов управления, которые изначально не видны.

Сведение к минимуму необходимых ресурсов

Минимизируйте ресурсы, необходимые для запуска вашего приложения или экрана. Эти усилия включают в себя тщательное определение или разделение ресурсов, необходимых вашему приложению или экрану. Ниже приведены несколько подходов, которые помогут вам.

Используйте стартовый экран с низкой степенью зависимости и исключите неиспользуемые экраны.

Используйте первый экран с низкой зависимостью, например приветствие, в вашем приложении. Создайте экран, который не загружает коллекцию, таблицу или справочные данные. Это управляет восприятием скорости пользователем и позволяет Power Fx правильно отложить некоторые вычисления на потом. Если у вас есть неиспользуемые экраны, удалите их.

Не используйте большого количества зависимостей между экранами

Межстраничные ссылки вызывают загрузку дополнительных страниц через ссылки, например, ссылаясь на элементы управления на страницах и помещая их в коллекции. Некоторые ссылки могут быть неизбежными. Если возможно, централизуйте общие ссылки на одной странице, чтобы загружалась только страница.

Рассмотрите встроенное мультимедиа

Авторы иногда встраивают медиафайлы в свои приложения, чтобы обеспечить быструю загрузку. Если у вас есть встроенные файлы мультимедиа, подумайте, используете ли вы их. Если нет, удалите их. Если вы встроили файл .png, рассмотрите возможность замены файлом .svg меньшего размера. Обратите внимание: если вы используете .svg, шрифт для .svg должен находиться на клиентском компьютере. Рассмотрите разрешение встроенного мультимедиа. Не слишком ли оно велико для устройства, на котором оно будет использоваться?

Не забудьте App.StartScreen

Если вы используете App.StartScreen, убедитесь, что первый экран — пустой. Из-за текущей упаковки приложения первый логический экран всегда связан с логикой инициализации приложения и будет инициализирован независимо от того, перейдем ли мы к нему когда-либо.

Рассмотрите возможность разделения приложения

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

Предложения

Чтобы достичь цели быстрого запуска приложения и страницы, рассмотрите следующие вопросы и предложения:

  1. Вы загружаете много данных на первом экране? Можете ли вы использовать другой первый экран?
  2. Вы выполняете много команд или выражений Power Fx в начале загрузки приложения? Можете ли вы отложить эти команды и выражения на более поздний этап приложения? Вы получаете только те данные, которые необходимы для запуска приложения? 1. Можно ли преобразовать выражения в App.OnStart в именованные формулы с помощью App.Formulas? Это позволяет Power Fx решить, когда на самом деле выполнять формулу, а не заставляет ее выполняться при событиях загрузки или навигации.
  3. Можно ли использовать отдельный поток Power Automate для создания временной таблицы в локальном хранилище данных, например Dataverse, который объединяет данные из разных источников? А затем получить доступ к этим данным в вашем приложении Power App?
  4. Можете ли вы использовать для запуска бизнес-процессов действия, запускаемые сервером, вместо вызова потока Power Automate?
  5. Можете ли вы создать на сервере представление, которое будет объединять данные для вас?
  6. Если вы хотите использовать автономные данные в своем приложении, можете ли вы использовать функцию автономного режима Power Apps, которая работает с Dataverse? Если ваши данные отсутствуют в Dataverse, можно ли переместить их туда?