Нотатка
Доступ до цієї сторінки потребує авторизації. Можна спробувати ввійти або змінити каталоги.
Доступ до цієї сторінки потребує авторизації. Можна спробувати змінити каталоги.
Оскільки програми на полотні розвиваються для задоволення різних потреб бізнесу, підтримка оптимальної продуктивності має вирішальне значення. Обробка даних, дизайн інтерфейсу користувача та функціональність програми – все це вимагає ретельного підходу до оптимізації коду.
Зі зростанням складності додатків для Canvas виникають проблеми з пошуком даних, складністю формул і швидкістю рендерингу. Щоб збалансувати потужний функціональний стиль із чутливим інтерфейсом, використовуйте систематичний підхід до оптимізації коду.
Оптимізація формул Power FX
У цьому розділі наведено найкращі практики для оптимізації формул Power Fx.
З функцією
Функція With обчислює формулу для окремого запису. Формула може обчислювати значення або виконувати дії, наприклад змінювати дані або працювати зі з’єднанням. Використовується With для полегшення читання складних формул шляхом поділу їх на менші іменовані підформули. Ці іменовані значення діють як прості локальні змінні, обмежені областю видимості With.
With кращий за контекст або глобальні змінні, бо він самодостатній, простий для розуміння і працює в будь-якому контексті декларативної формули. Дізнайтеся більше про функцію With.
Паралельна функція
Ця Concurrent функція дозволяє одночасно оцінювати кілька формул у одній властивості, якщо вони мають виклики конектора або Dataverse. Зазвичай, кілька формул обчислюються одночасно, коли ви з’єднуєте їх з оператором ; (крапка з комою). При цьому Concurrent додаток оцінює всі формули у властивості одночасно, навіть після використання оператора ; . Ця паралельність означає, що користувачі менше чекають на результати. Коли дзвінки з передачі даних не починаються до завершення попередніх дзвінків, додаток чекає на суму всіх запитів. Якщо дзвінки з даними починаються одночасно, додаток чекає лише найдовший час запиту. Дізнайтеся більше про функцію Concurrent.
Concurrent(
ClearCollect(colAccounts1, Accounts),
ClearCollect(colUsers1, Users),
ClearCollect(colEnvDef1, 'Environment Variable Definitions'),
ClearCollect(colEnvVal1, 'Environment Variable Values')
);
Функція коалессу
Функція Coalesce обчислює свої аргументи по порядку та повертає перше значення, яке не є порожнім або порожнім рядком. Використовуйте цю функцію для заміни пустого значення або порожнього рядка іншим значенням, але залиште непорожні та непорожні значення рядків без змін. Якщо всі аргументи порожні або порожні рядки, функція повертає порожні рядки.
Coalesce є хорошим способом перетворення порожніх рядків у порожні значення. Дізнайтеся більше про функцію Coalesce.
Цей приклад вимагає value1 оцінки двічі:value2
If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)
Ця функція може бути зведена до:
Coalesce(value1, value2)
Функція IsMatch
Функція IsMatch перевіряє, чи збігається текстовий рядок зі зразком, що складається зі звичайних символів, попередньо визначених шаблонів або регулярного виразу. Дізнайтеся більше про функцію IsMatch.
Наприклад, ця формула відповідає номеру соціального страхування United States:
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
Властивість для додатків на Canvas відіграє ключову роль у визначенні OnStart дій, які відбуваються під час запуску додатку. Ця властивість дозволяє розробникам додатків виконувати глобальні завдання ініціалізації, встановлювати змінні та виконувати дії, які повинні відбутися лише один раз під час процесу запуску програми. Розумійте та ефективно використовуйте цю OnStart властивість для створення чутливих і ефективних додатків на Canvas.
Оптимізуйте 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 and 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 на роз'єм 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 App чистим і організованим для кращої продуктивності та легшої розробки.
Оптимізуйте колекції
Колекції — це тимчасові структури storage даних, які ви використовуєте для зберігання та обробки даних у додатку 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"))Цей приклад повертає такий набір даних:
Установіть частоту оновлення джерела даних. Якщо ви додаєте нові записи до колекції, оновіть її або зберіть до неї, щоб отримати нові або змінені записи. Якщо джерело даних оновлюють кілька користувачів, оновіть колекцію, щоб отримати нові або змінені записи. Більше оновлених дзвінків означає більше взаємодії з сервером.
Кешування даних у колекціях та змінних
Колекція – це змінна таблиці, яка зберігає рядки та стовпці даних, а не лише окремий елемент даних. Колекції корисні з двох основних причин: агрегування даних перед надсиланням їх до джерела даних та кешування інформації для уникнення частих запитів. Оскільки колекції відповідають табличній структурі джерела даних і 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"
}
)
Видаліть невикористовувані змінні та медіафайли
Хоча невикористані медіа та змінні можуть суттєво не впливати на продуктивність додатку, важливо очистити додаток, видаляючи невикористані медіа або змінні.
Медіафайли, які не використовуються, збільшують розмір програми, що може сповільнити час завантаження програм.
Змінні, що не використовуються, збільшують використання пам’яті та можуть трохи уповільнити ініціалізацію додатків. На ці змінні виділяються ресурси, навіть якщо вони не використовуються. Занадто багато невикористовуваних змінних також може ускладнити логіку програми.
Використовуйте App Checker для перегляду невикористаних медіафайлів і змінних.
Оптимізація екранів і елементів керування
Щоб оптимізувати екрани та керування в Power Apps, розгляньте наступні найкращі практики.
Уникайте елементів керування перехресними посиланнями
Елементи керування, які посилаються на інші екрани, можуть уповільнювати завантаження програм і навігацію. Такий підхід може змусити додаток завантажувати інші екрани, а не чекати, поки користувач перейде на цей екран. Щоб вирішити цю проблему, використовуйте змінні, колекції та навігаційний контекст для обміну станом між екранами.
Перевірка додатків у Power Apps Studio показує елементи керування, які є перехресними посиланнями. Щоб вирішити цю проблему, регулярно перевіряйте App Checker.
На наступному зображенні керування Gallery 1 порівнюється у контролі Screen 2, Label 2.
Якщо посилатися на керування з першого екрану в додатку на другому екрані, продуктивність не зменшується, бо перший екран уже завантажений. Ця поведінка насправді корисна, бо додаток декларативний, а не використовує змінні.
Якщо звертатися до елементів керування, які ще не завантажені, наприклад, на першому екрані, що посилається на керування з Label 3 третього екрану, додаток завантажує цей екран у пам'ять.
Увімкніть функцію DelayOutput для керування текстом
Налаштування DelayOutput, коли встановлено true (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, ви можете створювати low-code плагіни для обробки даних на сервері та повернення лише кінцевих результатів до вашої програми canvas.
Делегування обробки даних на сервер може підвищити продуктивність, зменшити кількість коду на стороні клієнта та спростити обслуговування вашої програми.
Дізнайтеся більше про плагіни Dataverse.
Оптимізуйте шаблони даних запитів
Оптимізація того, як ваш додаток обробляє запити до даних, може суттєво скоротити час завантаження та покращити загальну оперативність.
Використовуйте явний вибір стовпців
Функцію явного вибору стовпця (ECS) увімкнено за замовчуванням для всіх нових програм. Якщо додаток не увімкнений, увімкніть його. ECS автоматично зменшує кількість отриманих стовпців до лише тих, що використовуються в програмі. Якщо ECS не ввімкнуто, ви можете отримати більше даних, ніж потрібно, що може вплинути на продуктивність. Іноді, коли програма отримує дані через колекції, оригінальне джерело стовпця може бути втрачено. ECS скидає колонки, якщо не може визначити, що вони використані. Щоб змусити ECS зберігати відсутній стовпець, використовуйте вираз ShowColumns Power FX після посилання колекції або в контрольному елементі.
Уникайте виклику 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 у 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"
})
);