Notă
Accesul la această pagină necesită autorizare. Puteți încerca să vă conectați sau să modificați directoarele.
Accesul la această pagină necesită autorizare. Puteți încerca să modificați directoarele.
Pe măsură ce aplicațiile pe pânză evoluează pentru a satisface diferite nevoi de afaceri, menținerea performanței optime este esențială. Gestionarea datelor, designul interfeței utilizator și funcționalitatea aplicației necesită o abordare atentă a optimizării codului.
Când aplicațiile pe pânză devin mai complexe, puteți întâmpina probleme legate de recuperarea datelor, complexitatea formulelor și viteza de randare. Echilibrul dintre o funcționalitate puternică și o interfață utilizator responsivă înseamnă că aveți nevoie de o abordare sistematică a optimizării codului.
Power Fx optimizarea formulelor
Cu funcție
Funcția With evaluează o formulă pentru o singură înregistrare. Formula poate calcula o valoare sau poate efectua acțiuni, cum ar fi modificarea datelor sau lucrul cu o conexiune. Folosește With pentru a face formulele complexe mai ușor de citit, împărțindu-le în subformule mai mici, denumite. Aceste valori denumite se comportă ca niște variabile locale simple, limitate la domeniul de aplicare al With. Utilizarea lui With este mai bună decât cea a variabilelor contextuale sau globale, deoarece este autonomă, ușor de înțeles și funcționează în orice context de formulă declarativă.
Aflați mai multe despre funcția . With
Funcție concurentă
Funcția Concurrent permite evaluarea simultană a mai multor formule din aceeași proprietate, dacă au conectori sau Dataverse apeluri. În mod normal, mai multe formule sunt evaluate simultan atunci când le înlănțuiți cu operatorul ; (punct și virgulă). Cu Concurrent, aplicația evaluează toate formulele dintr-o proprietate în același timp, chiar și după utilizarea operatorului ; . Această concurență înseamnă că utilizatorii așteaptă mai puțin rezultatele. Când apelurile de date nu încep până la finalizarea apelurilor anterioare, aplicația așteaptă suma tuturor timpilor de solicitare. Dacă apelurile de date încep în același timp, aplicația așteaptă doar cea mai lungă durată de solicitare.
Aflați mai multe despre funcția . Concurrent
Concurrent(
ClearCollect(colAccounts1, Accounts),
ClearCollect(colUsers1, Users),
ClearCollect(colEnvDef1, 'Environment Variable Definitions'),
ClearCollect(colEnvVal1, 'Environment Variable Values')
);
Funcția de coalescență
Funcția Coalesce își evaluează argumentele în ordine și returnează prima valoare care nu este necompletată sau un șir gol. Utilizați această funcție pentru a înlocui o valoare goală sau un șir gol cu o valoare diferită, dar pentru a lăsa neschimbate valorile șirurilor negoale și negoale. Dacă toate argumentele sunt goale sau șiruri de caractere goale, funcția returnează o valoare goală.
Coalesce este o metodă bună de a converti șiruri goale în valori goale.
De exemplu:
If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)
Necesită ca valoarea 1 și valoarea 2 să fie evaluate de două ori. Această funcție poate fi redusă la:
Coalesce(value1, value2)
Funcția IsMatch
Funcția IsMatch testează dacă un șir de text se potrivește cu un model format din caractere obișnuite, modele predefinite sau o expresie regulată.
Aflați mai multe despre funcția . IsMatch
De exemplu, această formulă se potrivește cu un număr de asigurări sociale din Statele Unite:
IsMatch(TextInput1.Text, "\d{3}-\d{2}-\d{4}")
Explicația expresiei regulate:
\\d Se potrivește cu orice cifră (0-9).
{3} Specifică faptul că modelul de cifre precedent (\d) trebuie să apară exact de trei ori.
- Se potrivește cu caracterul cratimei.
{2} Specifică faptul că modelul de cifre precedent (\d) trebuie să apară exact de două ori.
{4} Specifică faptul că modelul de cifre precedent (\d) trebuie să apară exact de patru ori.
Mai multe exemple de IsMatch:
IsMatch(TextInput1.Text, "Hello World")
IsMatch(TextInput1\_2.Text, "(?!^\[0-9\]\\\*$)(?!^\[a-zA-Z\]\\\*$)(\[a-zA-Z0-9\]{8,10})")
Optimizați aplicația OnStart
Proprietatea OnStart pentru aplicațiile cavas joacă un rol crucial în definirea acțiunilor care au loc la lansarea aplicației. Această proprietate permite dezvoltatorilor de aplicații să execute sarcini de inițializare globală, să configureze variabile și să efectueze acțiuni care ar trebui să aibă loc o singură dată în timpul procesului de pornire al aplicației. Înțelegerea și utilizarea eficientă a proprietății OnStart este esențială pentru crearea de aplicații canvas responsive și eficiente.
O abordare recomandată este de a simplifica funcția prin migrarea configurațiilor variabilelor către formule denumite. App.OnStart Formulele denumite, în special cele configurate la începutul ciclului de viață al aplicației, se dovedesc a fi avantajoase. Aceste formule gestionează inițializarea variabilelor pe baza apelurilor de date, oferind o structură mai curată și mai organizată pentru codul tău. Mai multe detalii Creați aplicații canvas mari și complexe - Power Apps | Microsoft Learn.
Notă
Proprietatea OnStart este Imperativă. Este o listă ordonată de lucrări care trebuie efectuate înainte de afișarea primului ecran. Deoarece este atât de specific nu doar în ceea ce privește *ce* trebuie făcut, ci și *când* trebuie efectuată acea lucrare în funcție de ordine, limitează reordonarea și amânarea optimizărilor care s-ar putea face altfel.
Ecran de start
Dacă App.OnStart conține un apel de funcție Navigate , chiar dacă se află într-o funcție If și este apelată rar, trebuie să finalizăm execuția aplicației.
OnStart înainte de a afișa primul ecran al aplicației.
App.StartScreen este noua modalitate declarativă de a indica ce ecran ar trebui afișat primul, care nu blochează optimizările.
Setarea proprietății StartScreen afișează primul ecran înainte ca App.OnStart procesarea să fie finalizată.
App.StartScreen declares ce obiect de ecran să fie afișat primul fără a necesita nicio preprocesare.
În loc să scrii cod de genul:
App.OnStart = Collect(OrdersCache, Orders);
If(Param("AdminMode") = "1", Navigate(AdminScreen), Navigate(HomeScreen))
Schimbați codul la:
App.OnStart = Collect(OrdersCache, Orders);
App.StartScreen = If(Param("AdminMode") = "1", AdminScreen, HomeScreen)
Consultați <https://Power Apps.microsoft.com/en-us/blog/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart/> pentru mai multe detalii.
Avertisment
Evitați dependențele între StartScreen și OnStart. Referirea la o formulă denumită care, la rândul ei, face referire la o variabilă globală poate cauza o condiție de concurență care StartScreen nu este aplicată corect.
Notă: nu ar trebui să existe dependențe între StartScreen și OnStart. Blocăm referirea la variabile globale în StartScreen, dar putem face referire la o formulă denumită, care la rândul ei face referire la o variabilă globală, ceea ce poate cauza o condiție de concurență în care StartScreen nu este aplicat corect.
Formulele denumite
Formulele denumite sunt statice sau constante care pot fi definite în secțiunea App.Formulas. Odată declarate în App.Formulas, acestea pot fi utilizate oriunde în aplicație, iar valoarea lor rămâne mereu actualizată. Formulele denumite permit definirea valorilor sau a seturilor de valori care sunt gestionate și actualizate automat de către platformă. Power Apps Această funcționalitate transferă responsabilitatea calculării valorii și a întreținerii acesteia de la dezvoltator către Power Apps, simplificând procesul de dezvoltare. Formulele denumite în Power Apps sunt o funcționalitate puternică ce poate îmbunătăți semnificativ performanța și mentenanța aplicației.
Formulele denumite pot aborda și declararea temelor aplicației. În multe cazuri în care se construiesc aplicații enterprise, dorim ca aplicația să aibă teme comune pentru a oferi un aspect și o experiență de utilizare consecvente. Pentru a crea o temă, există zeci și sute de variabile care trebuie declarate în App OnStart. Aceasta a crescut lungimea codului și timpul de inițializare al aplicației.
Controalele moderne pot ajuta, de asemenea, semnificativ la tematizare și pot contribui la reducerea logicii scrise de client pentru a gestiona tematizarea. Controalele moderne sunt momentan în versiune preliminară.
De exemplu, următorul cod din App.OnStart poate fi mutat în App.Formulas, reducând astfel timpul de pornire pentru declararea variabilelor globale.
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");
Codul poate fi mutat în App.Formulas după cum urmează:
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";
Un alt exemplu este setarea hanului Lookups. Aici, este necesară o modificare într-o formulă de căutare pentru a obține informațiile despre utilizator din Office 365, în loc de Dataverse. Există un singur loc unde este necesară modificarea fără a schimba codul peste tot.
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');
Aceste formule întruchipează esența calculului. Acestea articulează procesul de determinare a UserEmail, UserInfo, UserTitle și UserPhone pe baza altor valori. Această logică este încapsulată, permițând utilizarea pe scară largă în întreaga aplicație și poate fi modificată într-o singură locație. Adaptabilitatea se extinde la trecerea de la tabelul *Utilizatori* la conectorul *fără a fi necesare modificări ale formulelor răspândite în aplicație. Dataverse Office 365
O altă abordare este optimizarea countRows.
varListItems = CountRows(SampleList)
Cu funcția Set , variabila varListItems va trebui inițializată cu numărul inițial de rânduri din lista eșantion și setată din nou după ce elementele din listă au fost adăugate sau eliminate. În cazul formulelor denumite, pe măsură ce datele se modifică, variabilele varListitems se actualizează automat.
Formulele denumite din proprietatea App.Formulas oferă o abordare mai flexibilă și declarativă pentru gestionarea valorilor și calculelor în întreaga aplicație, oferind avantaje în ceea ce privește independența față de timp, actualizările automate, mentenabilitatea și definițiile imuabile în comparație cu bazarea exclusivă pe App.OnStart.
| Aspect | Formule denumite (App.Formulas) | Aplicație.LaPornire |
|---|---|---|
| Independența de timp | Formulele sunt disponibile instantaneu și pot fi calculate în orice ordine. | Variabilele pot introduce dependențe de temporizare, afectând disponibilitatea. |
| Actualizări automate | Formulele se actualizează automat atunci când dependențele se modifică. | Variabilele sunt setate o singură dată la pornire; pot fi necesare actualizări manuale. |
| Capacitate de mentenanță | Formulele centralizate într-o singură locație îmbunătățesc mentenabilitatea. | Variabilele dispersate pot necesita găsirea și actualizarea în mai multe locuri. |
| Definiții imuabile | Definițiile formulelor din App.Formulas sunt imuabile. | Valorile variabile pot fi susceptibile la modificări accidentale. |
Funcții definite de utilizator
Funcțiile definite de utilizator din Power Apps Authoring Studio permit utilizatorilor să își creeze propriile funcții personalizate.
Pentru a utiliza această funcție, în setările de previzualizare, activați Funcția definită de utilizator (UDF). Funcționalitatea de previzualizare nu ar trebui utilizată în producție, motiv pentru care este dezactivată în mod implicit, dar va deveni disponibilă în curând.
Definiți o formulă sub App.Formulas după cum urmează:
FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula
Codul funcționează astfel:
FunctionNameeste folosit pentru a invoca funcțiaParametereste numele intrării. Una sau mai multe intrări sunt permiseDataTypeeste un argument transmis funcției care trebuie să corespundă acestui tip de date. Tipurile de date disponibile includ Boolean, Culoare, Dată, Dată și Oră, Dinamic, GUID, Hyperlink, Text și OrăOutputDataTypeeste tipul de date în care va fi ieșirea funcțieiFormulaeste ieșirea funcției
// Function to calculate the area of a circle based on the radius
calcAreaOfCircle(radius: Number): Number =
IfError(Pi() * radius * radius, 0);
Folosește IfError pentru a implementa gestionarea erorilor în cadrul funcției definite.
Apelează funcția definită din controlul text/etichetă.
calcAreaOfCircle(Int(*TextInput1*.Text))
Notă
Aceasta este o funcție experimentală și poate fi modificată. Unele tipuri de date, cum ar fi înregistrările și filtrele, nu sunt încă acceptate.
Optimizați variabilele
Variabilele definesc și setează valorile locale și globale pe care le utilizați în întreaga aplicație. Deși sunt convenabile, utilizarea unui număr prea mare de variabile poate face aplicația mai puțin eficientă.
Următorul exemplu demonstrează cum se setează o variabilă pentru fiecare atribut al unui obiect, ceea ce necesită utilizarea Set pentru fiecare proprietate.
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);
O abordare mai eficientă este să utilizați proprietatea doar atunci când aveți nevoie de ea:
Set(varEmployee, Office365Users.MyProfile())
"Welcome " & varEmployee.DisplayName
Folosește cu înțelepciune variabilele de context și variabilele globale. Dacă domeniul de aplicare al unei variabile depășește un singur ecran, utilizați variabile globale în loc de variabile de context.
Prea multe variabile neutilizate cresc utilizarea memoriei și pot încetini inițializarea aplicației. Resursele sunt alocate pentru aceste variabile chiar dacă nu le utilizați. Variabilele neutilizate adaugă, de asemenea, complexitate logicii aplicației tale. Deși impactul s-ar putea să nu fie grav, este o practică bună să păstrați Power App curată și organizată pentru o performanță mai bună și o dezvoltare mai ușoară.
Optimizați colecțiile
Colecțiile sunt structuri temporare de stocare a datelor pe care le utilizați pentru a stoca și manipula date într-o aplicație. Power Apps Însă colecțiile pot cauza supraîncărcări de performanță dacă le utilizați prea mult. Limitați utilizarea colecțiilor și folosiți-le doar atunci când este necesar.
// Use this pattern
ClearCollect(colErrors, {Text: gblErrorText, Code: gblErrorCode});
// Do not use this pattern
Clear(colErrors);
Collect(colErrors, {Text: gblErrorText, Code: gblErrorCode});
Pentru a număra înregistrările dintr-o colecție locală, utilizați CountIf în loc de Count(Filter()).
Luați în considerare aceste îndrumări atunci când lucrați cu colecții:
Limitați dimensiunea și numărul colecțiilor. Deoarece colecțiile sunt locale pentru aplicație, acestea sunt stocate în memoria dispozitivului mobil. Cu cât conțin mai multe colecții de date sau cu cât utilizați mai multe colecții, cu atât performanța este mai slabă. Folosește funcția ShowColumns pentru a obține doar anumite coloane. Adăugați funcția Filter pentru a obține doar datele relevante.
Următorul exemplu de funcție returnează întregul set de date.
ClearCollect(colDemoAccount, Accounts);
Comparați acest lucru cu următorul cod, care returnează doar anumite înregistrări și coloane:
ClearCollect(colAcc,
ShowColumns(
Filter(Accounts, !IsBlank('Address 1: City')),
"name","address1_city"))
Acest exemplu returnează următorul set de date:
Setați o frecvență de actualizare a sursei de date. Dacă adăugați înregistrări noi la colecție, reîmprospătați-o sau colectați în ea pentru a obține înregistrările noi sau modificate. Dacă mai mulți utilizatori actualizează sursa de date, reîmprospătați colecția pentru a obține înregistrările noi sau modificate. Mai multe apeluri de reîmprospătare înseamnă mai multă interacțiune cu serverul.
Cache-ul datelor în colecții și variabile
O colecție este o variabilă de tabel care stochează rânduri și coloane de date, nu doar un singur element de date. Colecțiile sunt utile din două motive principale: agregarea datelor înainte de a le trimite către sursa de date și stocarea în cache a informațiilor pentru a evita interogările frecvente. Deoarece colecțiile corespund structurii tabelare a sursei de date și Power Apps, acestea vă permit să interacționați eficient cu datele, chiar și atunci când sunteți offline.
// Clear the contents of EmployeeCollection, it already contains data
ClearCollect(
colEmployee,
{
Id: "1",
Name: "John",
Department: "IT"
},
{
Id: "2",
Name: "Nestor",
Department: "IT"
}
)
Eliminați variabilele și suporturile media neutilizate
Deși suporturile media și variabilele neutilizate pot să nu aibă un impact semnificativ asupra performanței aplicației, este important să curățați aplicația eliminând orice suporturi media sau variabile neutilizate.
Fișierele media neutilizate măresc dimensiunea aplicației, ceea ce poate încetini timpii de încărcare a aplicațiilor.
Variabilele neutilizate cresc utilizarea memoriei și pot încetini ușor inițializarea aplicației. Resursele sunt alocate pentru aceste variabile chiar dacă nu sunt utilizate. Prea multe variabile neutilizate pot, de asemenea, să facă logica aplicației mai complexă.
Folosește App Checker pentru a verifica mediile și variabilele neutilizate.
Optimizați ecranele și comenzile
Evitați controalele cu referințe încrucișate
Comenzile care fac referire la comenzi de pe alte ecrane pot încetini încărcarea și navigarea în aplicație. Acest lucru poate forța aplicația să încarce imediat celelalte ecrane, în loc să aștepte până când utilizatorul ajunge la ecranul respectiv. Pentru a remedia această problemă, utilizați variabile, colecții și context de navigare pentru a partaja starea pe mai multe ecrane.
Verificatorul de aplicații din Power Apps Studio afișează controale care au referințe încrucișate. Verificați periodic Verificatorul de aplicații pentru a remedia această problemă.
Iată un exemplu de controale cu referințe încrucișate. În imaginea de mai jos, controlul Galerie 1 este menționat în Ecranul 2, controlul Etichetă 2.
Dacă faceți referire la un control din primul ecran al aplicației în al doilea ecran, nu există o scădere a performanței, deoarece primul ecran este deja încărcat. Acest lucru poate fi de fapt un lucru bun, deoarece aplicația este declarativă în loc să utilizeze variabile.
Dacă faceți referire la controale care nu sunt încă încărcate, cum ar fi primul ecran care face referire la un control numit Label 3 din ecranul 3, aplicația încarcă ecranul respectiv în memorie.
Activează DelayOutput pentru controalele text
Setarea DelayOutput, atunci când este setată la true, înregistrează datele introduse de utilizator după o întârziere de o jumătate de secundă. Acest lucru este util pentru amânarea operațiunilor costisitoare până când utilizatorul termină de introdus textul, cum ar fi filtrarea atunci când datele de intrare sunt utilizate în alte formule.
De exemplu, pentru o galerie ale cărei elemente sunt filtrate în funcție de ceea ce introduce utilizatorul în controlul TextInput:
Cu DelayOutput setat la fals, care este valoarea implicită, galeria este filtrată imediat ce este tastat orice text. Dacă aveți o galerie cu multe elemente, reîncărcarea imediată a galeriei cu modificările încetinește performanța. E mai bine să aștepți puțin. Acest lucru este practic atunci când utilizați TextInput pentru un șir de căutare (consultați Search sau noile funcții StartsWith).
Cu DelayOutput setat la true, există o scurtă întârziere înainte ca modificările să fie detectate. Asta îți oferă timp să termini de tastat. Întârzierea funcționează bine cu proprietatea TextInput.OnChange. Dacă aveți acțiuni legate de modificări, nu doriți ca acestea să fie declanșate până nu terminați de tastat în câmp.
Delegare și procesare pe partea serverului
Delegare
Delegarea este un concept care se referă la capacitatea aplicației de a delega anumite operațiuni către sursa de date subiacentă, în loc să proceseze operațiunile în cadrul acesteia. Power Apps Power Apps Prin utilizarea delegării în Power Apps, dezvoltatorii pot crea aplicații mai eficiente și scalabile, care funcționează bine chiar și în scenarii care implică seturi de date mari. Este important să fiți conștienți de limitările de delegare pentru anumite surse de date și operațiuni și să proiectați aplicațiile în consecință pentru a obține performanțe optime.
![NOTĂ] Nu toate funcțiile sunt delegabile. Vă rugăm să consultați Înțelegerea Delegării pentru a afla mai multe despre delegare.
Delegarea are mai multe avantaje, cum ar fi optimizarea interogărilor și adăugarea de suport pentru seturi de date mari. În plus, dacă datele sursă se modifică frecvent, delegarea ajută la menținerea datelor actualizate.
Reduceți apelurile API către sursa de date
Uneori, poate părea convenabil să creezi colecții prin efectuarea de joncțiuni în cadrul aplicației tale pe pânză. Iată un exemplu:
În acest exemplu, există două tabele: Șoferi și Camioane. Codul creează o colecție de detalii despre șoferi și camioane, iar pentru fiecare camion, apelează șoferul care deține camionul.
// 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)));
Efectuarea unei astfel de joncțiuni în aplicația canvas poate genera numeroase apeluri către sursa de date, ceea ce duce la timpi de încărcare lenți.
O abordare mai bună este:
// 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'
)
)
În scenariul în timp real, puteți reduce timpii de încărcare de la cinci minute la sub 10 secunde prin corectarea datelor la sursă.
Procesare pe partea serverului
Diferite surse de date, cum ar fi SQL și Dataverse, vă permit să delegați procesarea datelor, cum ar fi filtrele și căutările, către sursa de date. În SQL Server, puteți crea vizualizări definite de o interogare. În Dataverse, puteți crea pluginuri low-code pentru a procesa date pe server și a returna doar rezultatele finale către aplicația dvs. canvas.
Delegarea procesării datelor către server poate îmbunătăți performanța, reduce codul pe partea de client și poate face aplicația mai ușor de întreținut.
Află mai multe despre pluginuri în Dataverse.
Optimizați modelele de date de interogare
Folosește selecția explicită a coloanei
Funcția Selecție explicită a coloanei (ECS) este activată în mod implicit pentru toate aplicațiile noi. Dacă nu este activată pentru aplicația ta, activează-o. ECS reduce automat numărul de coloane preluate doar la cele utilizate în aplicație. Dacă ECS nu este activat, este posibil să primiți mai multe date decât este necesar, ceea ce poate afecta performanța. Uneori, când o aplicație obține date prin colecții, sursa originală a unei coloane se poate pierde. ECS elimină coloanele dacă nu poate identifica faptul că sunt utilizate. Pentru a forța ECS să păstreze o coloană lipsă, utilizați expresia PowerFx ShowColumns după o referință la o colecție sau într-un control.
Evitați apelarea Power Automate pentru a popula o colecție
O practică obișnuită este utilizarea Power Automate pentru a prelua și popula colecțiile în Power Apps. Deși această abordare este validă, există situații în care s-ar putea să nu fie cea mai eficientă alegere. Apelarea Power Automate vine cu o suprasarcină de latență a rețelei și adaugă un cost de performanță de 0,6 secunde pentru a instanția Power Automate fluxul.
Suprautilizarea fluxurilor poate duce, de asemenea, la limite de execuție și la încetinirea procesării. Power Automate Prin urmare, evaluați întotdeauna compromisurile dintre latența rețelei și costul performanței.
Eliminați problema N+1
Problema N+1 este o problemă frecventă în interogările bazelor de date, unde, în loc să se preiau toate datele necesare într-o singură interogare, se fac mai multe interogări suplimentare pentru a prelua datele aferente. Acest lucru poate duce la probleme de performanță, deoarece fiecare interogare suplimentară implică costuri suplimentare.
Un apel simplu ca acesta pentru încărcarea unei colecții poate genera N+1 apeluri către sursa de date.
ClearCollect(MyCollection, OrdersList,
{
LookUp(CustomersList,CustomerID = OrdersList[@CustomerID])
}
)
În contextul aplicațiilor și galeriilor de tip pânză, problema N+1 poate apărea atunci când se lucrează cu surse de date și galerii care afișează înregistrări corelate. Problema apare de obicei atunci când se fac mai multe interogări pentru fiecare element afișat în galerie, ceea ce duce la un blocaj de performanță.
Folosește obiectele View în SQL Server pentru a evita problema interogărilor N+1 sau modifică interfața utilizator pentru a evita declanșarea scenariului N+1.
Dataverse preia automat datele necesare din tabelele conexe și puteți selecta coloanele din tabelele conexe.
ThisItem.Account.'Account Name'
Dacă dimensiunea *e* este mică (*500 de înregistrări*), o puteți stoca în cache într-o colecție și puteți utiliza colecția pentru a derula scenariul de interogare Căutare (N+1). RelatedDataSourc<
Limitarea dimensiunii pachetului
Deși Power Apps contribuie mult la optimizarea încărcării aplicațiilor, puteți lua măsuri pentru a reduce amprenta aplicațiilor dvs. O amprentă redusă este deosebit de importantă pentru utilizatorii de dispozitive mai vechi sau pentru utilizatorii din locații cu latență mai mare sau lățime de bandă redusă.
Evaluează conținutul media încorporat în aplicația ta. Dacă ceva nu este folosit, ștergeți-l.
Imaginile încorporate ar putea fi prea mari. În loc de fișiere PNG, vezi dacă poți folosi imagini SVG. Totuși, fiți atenți la utilizarea textului în imaginile SVG, deoarece fontul utilizat va trebui instalat pe client. O soluție excelentă atunci când trebuie să afișați text este suprapunerea unei etichete de text peste o imagine.
Evaluați dacă rezoluția este potrivită pentru factorul de formă. Rezoluția unei aplicații mobile nu trebuie să fie la fel de mare ca rezoluția unei aplicații desktop. Experimentați pentru a obține echilibrul potrivit între calitatea și dimensiunea imaginii.
Dacă aveți ecrane neutilizate, ștergeți-le. Aveți grijă să nu ștergeți ecranele ascunse pe care le folosesc doar creatorii sau administratorii de aplicații.
Evaluează dacă încerci să integrezi prea multe fluxuri de lucru într-o singură aplicație. De exemplu, aveți atât ecrane de administrator, cât și ecrane de client în aceeași aplicație? Dacă da, luați în considerare împărțirea lor în aplicații individuale. Această abordare va facilita, de asemenea, lucrul simultan la aplicații de către mai multe persoane și limitează „raza de explozie” (cantitatea de testare) atunci când modificările aplicației necesită o trecere completă a testului.
Optimizați pentru toți
Funcția ForAll din Power Apps este utilizată pentru a parcurge un tabel de înregistrări și a aplica o formulă sau un set de formule fiecărei înregistrări. Deși funcția în sine este versatilă, utilizarea necorespunzătoare a funcției ForAll poate face rapid aplicația mai puțin performantă.
Funcția ForAll este o funcție secvențială singulară în loc de o funcție concurentă. Prin urmare, analizează o singură înregistrare odată, obține rezultatul, apoi continuă cu următoarea până când a parcurs toate înregistrările din domeniul său de aplicare.
Evitați cu orice preț Nesting ForAll. Acest lucru poate duce la iterații exponențiale și poate avea un impact semnificativ asupra performanței.
ClearCollect(FollowUpMeetingAttendees.ForAll(ForAll(Distinct(AttendeesList.EmailAddress.Address).Lookup(Attendees))))
Actualizări în lot ale bazei de date
ForAll + Patch poate fi o abordare pentru actualizarea în lot a bazei de date. Totuși, fiți atenți când folosiți ordinea For All și Patch.
Următoarea funcție:
Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
{
demoName:"fromCanvas2"
})
);
Are performanțe mai bune decât:
ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
{
demoName:"test"
})
);