Бележка
Достъпът до тази страница изисква удостоверяване. Можете да опитате да влезете или да промените директориите.
Достъпът до тази страница изисква удостоверяване. Можете да опитате да промените директориите.
Тъй като приложенията за платно се развиват, за да отговорят на различни бизнес нужди, поддържането на оптимална производителност е от решаващо значение. Обработката на данни, дизайнът на потребителския интерфейс и функционалността на приложението изискват внимателен подход към оптимизирането на кода.
С нарастването на сложността на 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 Social Security:
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 функцията чрез миграция на настройките на променливите към именувани формули. Именуваните формули, особено тези, конфигурирани в началото на жизнения цикъл на приложението, са предимство. Тези формули се справят с инициализацията на променливи въз основа на извиквания на данни, осигурявайки по-чиста и по-организирана структура за вашия код. Научете повече в Създаване на големи и сложни canvas приложения.
Бележка
Имотът 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: декларативна алтернатива на Navigate в App.OnStart.
Предупреждение
Избягвайте зависимостите между StartScreen и OnStart. Позоваването на именувана формула, която от своя страна се позовава на глобална променлива, може да доведе до състезателно условие, което StartScreen не се прилага правилно.
Не създавайте зависимости между StartScreen и OnStart. Докато приложението блокира препращането към глобални променливи в StartScreen, можете да се позовавате на именувана формула, която от своя страна се позовава на глобална променлива. Този подход може да доведе до състезателна ситуация, при която не StartScreen се прилага правилно.
Наименувани формули
Именуваните формули са статични или константи, които могат да бъдат дефинирани в App.Formulas. След като бъдат декларирани в App.Formulas, те могат да се използват навсякъде в приложението и стойностите им винаги остават актуални. Именуваните формули в Power Apps ви позволяват да дефинирате стойности или набори от стойности, които платформата автоматично управлява и обновява. Тази функционалност прехвърля отговорността за изчисляване и поддръжка на стойността от разработчика към Power Apps, опростявайки процеса на разработка. Именуваните формули в Power Apps са мощна функция, която може значително да подобри производителността и поддръжката на приложението.
Именуваните формули също помагат при деклариране на теми на приложенията. Когато създавате корпоративни приложения, често искате приложението да има общи теми, които осигуряват постоянен външен вид и потребителско изживяване. За да създадете тема, трябва да декларирате десетки до стотици променливи в App.OnStart. Тази декларация увеличава дължината на кода и времето за инициализация на приложението.
Съвременните контроли също могат да помогнат значително с темизирането и да помогнат за намаляване на писмената от клиента логика за обработка на теми. Съвременните контроли в момента са в предварителен преглед.
Например, можете да преместите следния код върху App.OnStartApp.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');
Тези формули въплъщават същността на изчислението. Те артикулират процеса за определяне UserEmailUserInfoUserTitle и UserPhone въз основа на други ценности. Тази логика е капсулирана, което позволява широко използване в приложението и може да бъде модифицирана на едно място. Адаптивността се простира до превключване от таблицата Dataverse Users към Office 365 конектора, без да се налага промяна на формулите, разпръснати из приложението.
Друг подход е оптимизирането countRows.
varListItems = CountRows(SampleList)
С функцията Set трябва да инициализирате променливата varListItems с първоначалния брой редове в примерния списък и да я зададете отново след добавяне или премахване на елементите в списъка. При именувани формули, при промяна на данните, varListItems променливата се обновява автоматично.
Именуваните формули в App.Formulas свойството предоставят по-гъвкав и декларативен подход за управление на стойности и изчисления в цялото приложение. Те предлагат предимства по отношение на независимост от времето, автоматични актуализации, поддържаемост и неизменими дефиниции в сравнение с разчитането само на App.OnStart.
| Вид | Именувани формули (App.Formulas) | Приложение.OnStart |
|---|---|---|
| Независимост от времето | Формулите са достъпни мигновено и могат да се изчисляват в произволен ред. | Променливите могат да въведат времеви зависимости, които влияят на наличността. |
| Автоматични актуализации | Формулите се актуализират автоматично, когато зависимостите се променят. | Променливите се задават веднъж по време на стартиране; Може да са нужни ръчни ъпдейти. |
| Възможност за поддържане | Централизираните формули на едно място подобряват поддръжката. | Разпръснати променливи може да изискват намиране и актуализиране на няколко места. |
| Неизменими дефиниции | Формулните дефиниции в App.Formulas са неизменни. |
Стойностите на променливите могат да бъдат податливи на случайни промени. |
Дефинирани от потребителя функции
Потребителски дефинирани функции в Power Apps Studio ви позволяват да създавате свои собствени персонализирани функции.
Дефинирайте формула по-долу App.Formulas , както следва:
FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula
Кодът работи по следния начин:
FunctionNameактивира функцията.Parameterе името на входа. Можете да включите един или повече входни данни.DataTypeе типът данни, с който аргументът, похвърлен във функцията, трябва да съвпада. Наличните типове данни включват булев, цветен, дата, дата, динамичен (datetime), динамичен (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 показва контроли, които са препратени. Преглеждайте редовно програмата за проверка на приложения, за да отстраните този проблем.
На следващото изображение контролът Gallery 1 е препратен в контрол Screen 2, Label 2.
Ако използваш контрол от първия екран в приложението на втория екран, няма спад в производителността, защото първият екран вече е зареден. Това поведение всъщност е полезно, защото приложението е декларативно, вместо да използва променливи.
Ако се позовавате на контроли, които все още не са заредени, като първия екран, който препраща към контрол от Label 3 екран 3, приложението зарежда този екран в паметта.
Разрешаване на DelayOutput за текстови контроли
Настройката DelayOutput, когато е настроена на true, регистрира вход от потребителя след половинсекундно забавяне. Това забавяне е полезно за отлагане на скъпи операции, докато потребителят завърши въвеждането на текста, като филтриране при използване на вход в други формули.
Например, разгледайте галерия, чиито елементи се филтрират в зависимост от това какво потребителят въвежда в контрола TextInput:
Ако зададеш DelayOutput на false, което е по подразбиране, галерията филтрира веднага щом се въведе текст. Ако имате галерия с много предмети, презареждането на галерията с промени веднага забавя производителността. По-добре е да изчакаш. Това поведение е практично, когато
TextInputизползвате за търсачки или функциятаStartsWith.Ако зададеш DelayOutput на true, има кратко забавяне преди промените да бъдат засечени. Това забавяне осигурява време за завършване на писането. Забавянето работи добре с имота
TextInput.OnChange. Ако имаш действия, свързани с промени, не искаш те да се задействат, докато не завършиш въвеждането в полето.
Делегиране и обработка от страна на сървъра
Използването на делегиране и обработка от страна на сървъра позволява на вашето приложение ефективно да обработва големи набори от данни, като прехвърля операциите към източника на данни.
Делегиране
Делегирането в Power Apps се отнася до способността на приложението да прехвърля определени операции към основния източник на данни, вместо да обработва операциите в самия Power Apps. Чрез използване на делегиране в Power Apps можете да създадете по-ефективни и мащабируеми приложения, които работят добре дори в ситуации с големи набори от данни. Бъдете наясно с ограниченията при делегиране за конкретни източници на данни и операции и проектирайте приложението си съответно, за да постигнете оптимална производителност.
Бележка
Не всички функции могат да бъдат делегирани. Научете повече за делегирането в Query limitations: Delegation и query limits.
Делегирането има няколко предимства, като оптимизация на заявки и поддръжка на големи набори от данни. Освен това, ако изходните данни се променят често, делегирането помага да се поддържат данните актуални.
Намаляване на извикванията на 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)));
Извършването на такова присъединяване в приложението за платно може да генерира много повиквания към източника на данни, което води до бавно време за зареждане.
По-добър подход е:
// 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 него можете да създадете плъгини с нисък код, за да обработвате данни на сървъра и да връщате само крайните резултати на вашето приложение за платно.
Делегирането на обработката на данни на сървъра може да подобри производителността, да намали кода от страна на клиента и да улесни поддръжката на вашето приложение.
Научете повече за плъгините в Dataverse.
Оптимизиране на моделите на данни за заявки
Оптимизирането на начина, по който вашето приложение обработва заявки за данни, може значително да намали времето за зареждане и да подобри общата отзивчивост.
Използване на изричен избор на колони
Функцията за изричен избор на колона (ECS) е включена по подразбиране за всички нови приложения. Ако приложението ти не е включено, включи го. ECS автоматично намалява броя на извлечените колони само до тези, използвани в приложението. Ако ECS не е включен, може да получите повече данни, отколкото са ви необходими, което може да повлияе на производителността. Понякога, когато дадено приложение получава данни чрез колекции, първоначалният източник на колона може да бъде загубен. ECS премахва колоните, ако не може да определи дали са използвани. За да принудите ECS да запази липсваща колона, използвайте израза ShowColumns Power Fx след колекция или в контрол.
Избягвайте да се обаждате на Power Automate за попълване на колекция
Често се използва Power Automate за извличане и попълване на колекции в Power Apps. Въпреки че този подход е валиден, има ситуации, в които той може да не е най-ефективният избор. Обаждането на Power Automate добавя латентност в мрежата и 0.6 секунди разход за производителност, за да се реализира потокът на Power Automate.
Прекомерната употреба на Power Automate flows също може да доведе до ограничения в изпълнението и ограничаване. Винаги оценявайте компромисите между латентността на мрежата и разходите за производителност.
Елиминиране на проблема N+1
Проблемът N+1 е често срещан проблем при заявките към бази данни, където вместо извличане на всички необходими данни в една заявка, се правят множество допълнителни заявки за извличане на свързани данни. Този проблем може да доведе до проблеми с производителността, тъй като всяка допълнителна заявка налага допълнителни разходи.
Просто повикване като това за зареждане на колекция може да генерира N+1 повиквания към източника на данни:
ClearCollect(MyCollection, OrdersList,
{
LookUp(CustomersList,CustomerID = OrdersList[@CustomerID])
}
)
В контекста на canvas приложения и галерии може да възникне проблемът 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"
})
);