Оптимизация кода

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

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

Оптимизация формул Power Fx

В этом разделе приведены рекомендации по оптимизации формул Power Fx.

Функция With

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

Снимок экрана: формула Power Fx, использующая функцию With.

Функция Concurrent

Функция Concurrent позволяет вычислять несколько формул в рамках одного свойства одновременно, если они содержат вызовы соединителей или Dataverse. Обычно несколько формул вычисляются одновременно, если связать их с оператором ; (точка с запятой). С Concurrent приложение вычисляет все формулы в свойстве одновременно, даже после использования оператора ;. Эта конкурентность означает, что пользователи могут ожидать результатов быстрее. Если вызов данных не начинается до завершения предыдущего вызова, время ожидания в приложении будет суммой времени выполнения всех запросов по очереди. Если вызовы данных запускаются одновременно, временем ожидания приложения будет время выполнения самого длительного запроса. Дополнительные сведения о параллельной функции.

Concurrent(
    ClearCollect(colAccounts1, Accounts),
    ClearCollect(colUsers1, Users),
    ClearCollect(colEnvDef1, 'Environment Variable Definitions'),
    ClearCollect(colEnvVal1, 'Environment Variable Values')
);

Функция Coalesce

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

В этом примере требуется, чтобы value1 и value2 были вычислены дважды:

If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)

Эту функцию можно свести к:

Coalesce(value1, value2)

Функция IsMatch

Функция IsMatch проверяет, соответствует ли текстовая строка шаблону, состоящему из обычных символов, предварительно определенных шаблонов или регулярного выражения. Узнайте больше о функции IsMatch.

Например, эта формула сопоставляет номер социального страхования США:

IsMatch(TextInput1.Text, "\d{3}-\d{2}-\d{4}")

Объяснение регулярного выражения:

  • \\d — соответствует любой цифре (0–9).

  • {3} — указывает, что предыдущий символ шаблона цифр (\d) должен встречаться ровно три раза.

  • - — соответствует знаку дефиса.

  • {2} — указывает, что предыдущий цифровой шаблон (\d) должен встречаться ровно два раза.

  • {4} — указывает, что предыдущий шаблон числа (\d) должен повторяться ровно четыре раза.

Дополнительные примеры IsMatch:

IsMatch(TextInput1.Text, "Hello World")
IsMatch(TextInput1\_2.Text, "(?!^\[0-9\]\\\*$)(?!^\[a-zA-Z\]\\\*$)(\[a-zA-Z0-9\]{8,10})")

Оптимизация приложения OnStart

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

Оптимизируйте функцию App.OnStart путем переноса настроек переменных в именованные формулы. Именованные формулы, особенно настроенные в начале жизненного цикла приложения, являются выгодными. Эти формулы обрабатывают инициализацию переменных на основе вызовов данных, обеспечивая более чистую и организованную структуру вашего кода. Узнайте больше в разделе "Создание больших и сложных приложений для холста".

Замечание

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

Запускать экран

Если App.OnStart содержит вызов функции Navigate, даже если он находится в функции If и вызывается редко, приложение должно завершить выполнение App.OnStart, прежде чем отображать первый экран приложения.  App.StartScreen является декларативным способом, чтобы указать, какой экран должен отображаться первым, и он не блокирует оптимизацию.

Установка свойства StartScreen показывает первый экран перед завершением App.OnStart. App.StartScreen объявляет, какой объект экрана будет отображаться первым, не требуя предварительной обработки.

Вместо написания кода типа:

App.OnStart = Collect(OrdersCache, Orders);
If(Param("AdminMode") = "1", Navigate(AdminScreen), Navigate(HomeScreen))

Измените код на:

App.OnStart = Collect(OrdersCache, Orders);
App.StartScreen = If(Param("AdminMode") = "1", AdminScreen, HomeScreen)

Дополнительные сведения: App.StartScreen: декларативная альтернатива навигации в App.OnStart.

Предупреждение

Избегайте зависимости между StartScreen и OnStart. Ссылка на именованную формулу, которая, в свою очередь, ссылается на глобальную переменную, может вызвать состояние гонки, при котором StartScreen не применяется корректно.

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

Именованные формулы

Именованные формулы являются статическими или константами, которые можно определить в App.Formulas. После объявления в App.Formulas они могут использоваться в любом месте приложения, и их значения всегда остаются актуальными. Именованные формулы в Power Apps позволяют определять значения или наборы значений, которые платформа автоматически управляет и обновляет. Эта функция переместит ответственность за вычисление значений и ведение с разработчика на Power Apps, упрощая процесс разработки. Именованные формулы в Power Apps — это мощная функция, которая может значительно повысить производительность приложения и удобство обслуживания.

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

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

Например, вы можете переместить следующий код с App.OnStart на App.Formulas, что сократит время запуска при объявлении глобальных переменных.

Set(BoardDark, RGBA(181,136,99, 1));
Set(BoardSelect, RGBA(34,177,76,1));
Set(BoardRowWidth, 10);                      // expected 8 plus two guard characters for regular expressions.
Set(BoardMetadata, 8 \* BoardRowWidth + 1);   // which player is next, have pieces moved for castling rules, etc.
Set(BoardBlank, "----------------------------------------------------------------\_00000000000000");
Set(BoardClassic, "RNBQKBNR\_\_PPPPPPPP------------------------\_--------\_\_pppppppp\_\_rnbqkbnr\_\_0000000000");

Код можно переместить в App.Formulas следующим образом:

BoardSize = 70;
BoardLight = RGBA(240,217,181, 1);
BoardDark = RGBA(181,136,99, 1);
BoardSelect = RGBA(34,177,76,1);
BoardRowWidth = 10;                      // expected 8 plus two guard characters for regular expressions
BoardMetadata = 8 \* BoardRowWidth + 1;   // which player is next, have pieces moved for castling rules, etc.
BoardBlank = "----------------------------------------------------------------\_00000000000000";
BoardClassic = "RNBQKBNR\_\_PPPPPPPP------------------------\_--------\_\_pppppppp\_\_rnbqkbnr\_\_0000000000";

Другой пример — параметр Lookups. Здесь необходимо изменить формулу Lookup, чтобы получить сведения о пользователе из Office 365 вместо Dataverse. Необходимо внести изменения только в одно место, не изменяя код везде.

UserEmail = User().Email;
UserInfo = LookUp(Users, 'Primary Email' = User().Email);
UserTitle = UserInfo.Title;
UserPhone = Switch(UserInfo.'Preferred Phone', 'Preferred Phone (Users)'.'Mobile Phone', UserInfo.'Mobile Phone',
UserInfo.'Main Phone');

Эти формулы воплощают суть расчета. Они описывают процесс определения UserEmail, UserInfo, UserTitle и UserPhone на основе других значений. Эта логика инкапсулирована, что позволяет широко использовать ее во всем приложении, и ее можно изменить в одном месте. Адаптация распространяется на переход от таблицы Dataverse Users к коннектору Office 365 без необходимости вносить изменения в формулы, разбросанные по приложению.

Другой подход — оптимизировать countRows.

varListItems = CountRows(SampleList)

Set С помощью функции необходимо инициализировать переменную varListItems с начальным числом строк в примере списка и снова задать ее после добавления или удаления элементов списка. Когда данные изменяются, переменная varListItems в именованной формуле обновляется автоматически.

Именованные формулы в App.Formulas свойстве обеспечивают более гибкий и декларативный подход для управления значениями и вычислениями в приложении. Они предлагают преимущества с точки зрения независимости времени, автоматического обновления, удобства обслуживания и неизменяемых определений по сравнению с использованием исключительно App.OnStart.

Аспект Именованные формулы (App.Formulas) App.OnStart
Независимость от времени Формулы доступны мгновенно и могут вычисляться в любом порядке. Переменные могут вводить зависимости времени, влияющие на доступность.
Автоматическое обновление Формулы автоматически обновляются при изменении зависимостей. Переменные задаются один раз во время запуска; Может потребоваться обновление вручную.
Ремонтопригодность Централизованные формулы в одном месте повышают удобство обслуживания. Для разбросанных переменных может потребоваться поиск и обновление в нескольких местах.
Неизменяемые определения Определения формул в App.Formulas неизменяемы. Значения переменных могут быть подвержены случайным изменениям.

Функции, определяемые пользователем

Определяемые пользователем функции в Power Apps Studio позволяют создавать собственные пользовательские функции.

Определите формулу в разделе App.Formulas следующим образом:

FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula

Код работает следующим образом:

  • FunctionName вызывает функцию.

  • Parameter — имя входных данных. Можно включить один или несколько входных данных.

  • DataType — это тип данных, который аргумент, переданный в функцию, должен соответствовать. Доступные типы данных включают булевый, цвет, дата, дата и время, динамический, GUID, гиперссылка, текст и время.

  • OutputDataType — это тип данных для выходных данных функции.

  • Formula — это выходные данные функции.

Используется IfError для реализации обработки ошибок в определенной функции:

// Function to calculate the area of a circle based on the radius
calcAreaOfCircle(radius: Number): Number = 
    IfError(Pi() * radius * radius, 0);

Вызовите определённую функцию из текстового поля или элемента управления меткой.

calcAreaOfCircle(Int(*TextInput1*.Text))

Оптимизация переменных

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

В следующем примере показано, как задать переменную для каждого атрибута объекта, что требует использования Set для каждого свойства.

Set(varEmpName, Office365Users.MyProfile().DisplayName);
Set(varEmpCity, Office365Users.MyProfile().City);
Set(varEmpPhone, Office365Users.MyProfile().BusinessPhones);
Set(varEmpUPN, Office365Users.MyProfile().UserPrincipalName);
Set(varEmpMgrName, Office365Users.ManagerV2(varEmpUPN).DisplayName);

Более эффективным подходом является использование свойства только тогда, когда оно вам нужно:

Set(varEmployee, Office365Users.MyProfile())
"Welcome " & varEmployee.DisplayName

Используйте контекстные и глобальные переменные с умом. Если область действия переменной выходит за рамки одного экрана, используйте глобальные переменные вместо переменных контекста.

Слишком большое количество неиспользуемых переменных увеличивает использование памяти и может замедлить инициализацию приложения. Ресурсы выделяются для этих переменных, даже если вы их не используете. Неиспользуемые переменные также усложняют логику приложения. Держите ваши приложения Power Apps чистыми и упорядоченными, чтобы повысить производительность и упростить разработку.

Оптимизация коллекций

Коллекции — это временные структуры хранилища данных, используемые для хранения данных и управления ими в приложении Power Apps. Однако коллекции могут стать причиной снижения производительности. Ограничьте использование коллекций и используйте их только при необходимости.

// Use this pattern
ClearCollect(colErrors, {Text: gblErrorText, Code: gblErrorCode});

// Do not use this pattern
Clear(colErrors);
Collect(colErrors, {Text: gblErrorText, Code: gblErrorCode});

Чтобы подсчитать записи в локальной коллекции, используйте CountIf вместо Count(Filter()).

Рассмотрим этот подход при работе с коллекциями:

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

    В следующем примере функция возвращает весь набор данных:

    ClearCollect(colDemoAccount, Accounts);
    

    Сравните эту функцию со следующим кодом, который возвращает только определенные записи и столбцы:

    ClearCollect(colAcc,
      ShowColumns(
        Filter(Accounts, !IsBlank('Address 1: City')),
        "name","address1_city"))
    

    В этом примере возвращается следующий набор данных:

    Снимок экрана: набор данных с таблицей с именем colAcc и двумя столбцами, address1_city и именем.

  • Установка частоты обновления источника данных. Если вы добавляете новые записи в коллекцию, обновите её или соберите данные, чтобы получить новые или изменённые записи. Если источник данных обновляют несколько пользователей, обновите коллекцию, чтобы получить новые или измененные записи. Чем больше запросов обновления, тем больше взаимодействия с сервером.

Кэшируйте данные в коллекциях и переменных

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

// Clear the contents of EmployeeCollection, it already contains data
ClearCollect(
    colEmployee,
    {
        Id: "1",
        Name: "John",
        Department: "IT"
    },
    {
        Id: "2",
        Name: "Nestor",
        Department: "IT"
    }
)

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

Хотя неиспользуемые носители и переменные, вероятно, не оказывают значительного влияния на производительность приложения, важно навести порядок в вашем приложении, удалив все неиспользуемые носители или переменные.

  • Неиспользуемые медиафайлы увеличивают размер приложения, что может замедлить его загрузку.

  • Неиспользуемые переменные увеличивают использование памяти и могут немного замедлить инициализацию приложения. Ресурсы выделяются для этих переменных, даже если они не используются. Слишком большое количество неиспользуемых переменных также может усложнить логику приложения.

  • Используйте «Средство проверки приложений» для проверки неиспользуемых мультимедиа и переменных.

Оптимизация экранов и элементов управления

Чтобы оптимизировать экраны и элементы управления в Power Apps, рассмотрите следующие рекомендации.

Избегайте перекрестных ссылок на элементы управления

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

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

На следующем рисунке на элемент управления Gallery 1 ссылается элемент управления Screen 2, Label 2.

Снимок экрана Power Apps Studio с перекрестной ссылкой на элемент управления.

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

Если вы ссылаетесь на элементы управления, которые еще не загружены, например, когда первый экран ссылается на элемент управления с экрана 3 Label 3, приложение загружает этот экран в память.

Включение DelayOutput для элементов управления текстом

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

Например, рассмотрим коллекцию , элементы которой фильтруются в зависимости от того, что пользователь вводит в элемент управления TextInput:

  • Если параметр DelayOutput имеет значение false, то по умолчанию коллекция фильтрует сразу после ввода любого текста. Если в вашей галерее много элементов, немедленная перезагрузка галереи с изменениями замедляет работу. Лучше ждать. Это поведение является практическим, если вы используете TextInput строку поиска или StartsWith функцию.

  • Если параметр DelayOutput имеет значение true, перед обнаружением изменений возникает небольшая задержка. Эта задержка предоставляет время завершения ввода. Задержка хорошо работает со свойством TextInput.OnChange. Если у вас есть действия, связанные с изменениями, вы не хотите, чтобы они активировались, пока не завершите ввод в поле.

Делегирование и обработка на стороне сервера

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

Делегирование

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

Замечание

Не все функции являются делегированными. Узнайте больше о делегировании в разделе Ограничения запросов: делегирование и пределы запросов.

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

Сокращение вызовов API к источнику данных

Иногда может показаться удобным создавать коллекции, выполняя соединения внутри приложения на основе холста. Рассмотрим следующий пример. В примере есть две таблицы: водители и грузовики. Код создает коллекцию сведений о водителях и грузовиках и для каждого грузовика вызывает водителя, которому принадлежит грузовик.

// Bad code
ClearCollect(vartruckdata, AddColumns('Truck Details',
    "CITY",LookUp(Drivers, 'Truck Details'\[@'Dummy ID'\] = Drivers\[@'Truck Details'\],City),
        "FIRSTNAME",LookUp(Drivers, 'Truck Details'\[@'Dummy ID'\] = Drivers\[@'Truck Details'\],'Driver First Name'),
    "LASTNAME",LookUp(Drivers, 'Truck Details'\[@'Dummy ID'\] = Drivers\[@'Truck Details'\],'Driver Last Name'),
        "STATE",LookUp(Drivers, 'Truck Details'\[@'Dummy ID'\] = Drivers\[@'Truck Details'\],State)));

Выполнение такого объединения в приложениях Canvas может вызывать множество вызовов к источнику данных, что приводит к медленной загрузке.

Лучший подход:

// Good code
Set(
    varTruckData,
    LookUp(
        Drivers,
        'Dummy ID' = ThisRecord.'Dummy ID',
        'Driver First Name'
    ) & LookUp(
        Drivers,
        'Dummy ID' = ThisRecord.'Dummy ID',
        'Driver Last Name'
        )
);

Set(
    varTruckData,
    With(
        {
            vDriver: LookUp(
                Drivers,
                'Dummy ID' = ThisRecord.'Dummy ID'
            )
        },
        vDriver.'Driver First Name' & vDriver.'Driver Last Name'
    )
)

В сценарии реального времени можно сократить время загрузки от пяти минут до 10 секунд, исправив данные в источнике.

Обработка на стороне сервера

Различные источники данных, такие как SQL и Dataverse, позволяют делегировать обработку данных, например, фильтры и поиск, источнику данных. В SQL Server можно создавать представления, определяемые запросом. В Dataverse можно создавать подключаемые модули с минимальным количеством кода для обработки данных на сервере и возвращать только конечные результаты в ваше canvas-приложение.

Делегирование обработки данных серверу может повысить производительность, сократить количество клиентского кода и упростить обслуживание приложения.

Узнайте больше о плагинах в Dataverse.

Оптимизация шаблонов данных запросов

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

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

Функция явного выбора столбцов (ECS) включена по умолчанию для всех новых приложений. Если он не включен для приложения, включите его. ECS автоматически уменьшает количество извлекаемых столбцов до тех, которые используются в приложении. Если ECS не включена, вы можете получить больше данных, чем вам нужно, что может повлиять на производительность. Иногда, когда приложение получает данные через коллекции, исходный источник столбца может быть утерян. ECS удаляет столбцы, если невозможно определить, что они используются. Чтобы заставить ECS сохранить отсутствующий столбец, используйте выражение Power Fx ShowColumns после ссылки на коллекцию или в элементе управления.

Избегайте вызова Power Automate для заполнения коллекции

Распространенная практика — использовать Power Automate для получения и заполнения коллекций в Power Apps. Хотя этот подход допустим, существуют ситуации, когда он может быть не самым эффективным выбором. Вызов Power Automate добавляет сетевую задержку и уменьшает быстродействие на 0,6 секунды, так как необходимо создать экземпляр потока Power Automate.

Чрезмерное использование потоков Power Automate также может привести к ограничениям на выполнение и регулированию. Всегда оценивать компромиссы между задержкой сети и затратами на производительность.

Устранение проблемы N+1

Проблема N+1 — распространенная проблема в запросах к базе данных, когда вместо получения всех необходимых данных в одном запросе выполняется несколько дополнительных запросов для получения связанных данных. Эта проблема может привести к проблемам с производительностью, так как каждый дополнительный запрос приводит к затратам.

Простой вызов, как это для загрузки коллекции, может создавать вызовы N+1 к источнику данных:

ClearCollect(MyCollection, OrdersList,
    {
        LookUp(CustomersList,CustomerID = OrdersList[@CustomerID])
    }
)

В контексте приложений на основе холста и коллекций проблема N+1 может возникнуть при работе с источниками данных и коллекциями, в которых отображаются связанные записи. Проблема обычно возникает, когда для каждого элемента, отображаемого в коллекции, выполняется больше запросов, что приводит к снижению производительности.

Используйте объекты View в SQL Server, чтобы избежать проблем с запросами N+1, или измените пользовательский интерфейс, чтобы избежать запуска сценария N+1.

Dataverse автоматически извлекает необходимые данные из связанных таблиц, и вы можете выбирать столбцы из связанных таблиц.

ThisItem.Account.'Account Name'

Если RelatedDataSource размер невелик (менее 500 записей), кэшируйте его в коллекции и используйте коллекцию для выполнения сценария запроса Lookup (N+1).

Ограничение размера пакета

Несмотря на то, что Power Apps оптимизирует загрузку приложений, вы можете предпринять шаги, чтобы сократить объем ресурсов приложений. Уменьшение объема особенно важно для пользователей старых устройств или пользователей в регионах, где наблюдается более высокая задержка или сниженная пропускная способность.

  • Оцените медиа, встроенные в ваше приложение. Если что-то не используется, удалите это.

    Например, внедренные изображения могут быть слишком большими. Вместо файлов PNG проверьте, можно ли использовать изображения SVG. Будьте осторожны с использованием текста в изображениях SVG, так как шрифт должен быть установлен на клиенте. Обходное решение, когда необходимо отобразить текст, — это наложить текстовую метку на изображение.

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

  • Если у вас есть неиспользуемые экраны, удалите их. Будьте осторожны и не удаляйте скрытые экраны, которыми пользуются только создатели приложений или администраторы.

  • Оцените, не пытаетесь ли вы уместить слишком много рабочих процессов в одном приложении. Например, есть ли у вас в одном приложении и экраны администратора, и экраны клиента? Если да, рассмотрите возможность разделения их на отдельные приложения. Этот подход также упрощает работу нескольких пользователей с приложениями одновременно, и он ограничивает "радиус взрыва" (объем тестирования), когда изменения приложения требуют полного прохождения теста.

Оптимизация функции ForAll

Функция ForAll в Power Apps используется для итерации таблицы записей и применения формулы или набора формул к каждой записи. Хотя сама функция является универсальной ForAll , неправильное использование функции может быстро снизить производительность приложения.

Функция ForAll является последовательной функцией, а не параллельной функцией. Следовательно, она обрабатывает только одну запись за раз, получает результат, а затем переходит к следующей записи, пока не переберет все записи в своей области видимости.

Избегайте вложения ForAll. Эта практика может привести к экспоненциальным итерациям и значительно влиять на производительность.

ClearCollect(FollowUpMeetingAttendees.ForAll(ForAll(Distinct(AttendeesList.EmailAddress.Address).Lookup(Attendees))))

Пакетное обновление базы данных

Вы можете использовать ForAll и Patch для пакетного обновления базы данных. Однако будьте осторожны при использовании порядка ForAll и Patch.

Следующая функция является лучшим подходом, например:

Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
    {
        demoName:"fromCanvas2"
    })
);

В то время как следующий подход является менее эффективным:

ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
    {
        demoName:"test"
    })
);

Следующий шаг