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.
Pe măsură ce aplicațiile Canvas devin tot mai complexe, poți întâmpina probleme legate de recuperarea datelor, complexitatea formulelor și viteza de randare. Pentru a echilibra funcționalitatea puternică cu o interfață de utilizator receptivă, folosește o abordare sistematică a optimizării codului.
Optimizarea formulei Power Fx
Această secțiune oferă cele mai bune practici pentru optimizarea formulelor Power Fx.
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.
With este mai bun decât contextul sau variabilele globale pentru că este autonom, ușor de înțeles și funcționează în orice context de formulă declarativă. Află 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 apeluri conector sau Dataverse. Î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 timp pentru rezultate. 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. Află mai multe despre funcția concurentă.
Concurrent(
ClearCollect(colAccounts1, Accounts),
ClearCollect(colUsers1, Users),
ClearCollect(colEnvDef1, 'Environment Variable Definitions'),
ClearCollect(colEnvVal1, 'Environment Variable Values')
);
Funcția de coalesce
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. Află mai multe despre funcția Coalesce.
Acest exemplu necesită value1 și value2 trebuie evaluat de două ori:
If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)
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ă. Află mai multe despre funcția IsMatch.
De exemplu, această formulă corespunde unui număr de securitate socială al United States:
IsMatch(TextInput1.Text, "\d{3}-\d{2}-\d{4}")
Explicația expresiei regulate:
\\dSe 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 aplicațiilor canvas 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țelege și folosește eficient proprietatea OnStart pentru a crea aplicații Canvas receptive și eficiente.
Simplifică funcția App.OnStart prin migrarea configurărilor variabilelor către formule denumite. Formulele denumite, în special cele configurate la începutul ciclului de viață al aplicației, sunt avantajoase. Aceste formule gestionează inițializarea variabilelor pe baza apelurilor de date, oferind o structură mai curată și mai organizată pentru codul tău. Află mai multe în Construiește aplicații canvas mari și complexe.
Notă
Proprietatea OnStart este imperativă. Este o listă ordonată de lucrări care trebuie făcute înainte să apară primul ecran. Pentru că este atât de specific nu doar în ceea ce trebuie făcut, ci și când acea muncă trebuie făcută în funcție de ordine, limitează optimizările de reordonare și amânare care altfel ar putea fi făcute.
Ecran de start
Dacă App.OnStart conține un Navigate apel de funcție, chiar dacă este într-o If funcție și este rar apelat, aplicația trebuie să finalizeze execuția înainte App.OnStart să afișeze primul ecran al aplicației.
App.StartScreen este o modalitate declarativă de a indica care ecran ar trebui afișat primul și nu blochează optimizările.
Setarea proprietății StartScreen afișează primul ecran înainte ca App.OnStart procesarea să fie finalizată.
App.StartScreen declară care obiect de ecran să fie afișat primul fără a necesita 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)
Mai multe informații: App.StartScreen: o alternativă declarativă la Navigate în App.OnStart.
Avertisment
Evitați dependențele între StartScreen și OnStart. Referințierea la o formulă denumită care, la rândul ei, face referire la o variabilă globală, ar putea cauza o condiție de rasă în care StartScreen nu este aplicată corect.
Nu crea dependențe între StartScreen și OnStart. În timp ce aplicația blochează referințele la variabile globale în StartScreen, poți face referire la o formulă denumită, care la rândul ei face referire la o variabilă globală. Această abordare ar putea cauza o condiție de cursă în care aplicarea StartScreen nu este corectă.
Formulele denumite
Formulele denumite sunt statice sau constante care pot fi definite în App.Formulas. Odată declarate în App.Formulas, pot fi folosite oriunde în aplicație, iar valorile lor rămân mereu actualizate. Formulele denumite din Power Apps îți permit să definești valori sau seturi de valori pe care platforma le gestionează și actualizează automat. Această funcționalitate transferă responsabilitatea calculului valorii și întreținerii de la dezvoltator către Power Apps, eficientizând procesul de dezvoltare. Formulele denumite din Power Apps sunt o funcție puternică care poate îmbunătăți semnificativ performanța și mentenabilitatea aplicațiilor.
Formulele denumite ajută, de asemenea, la declararea temelor aplicației. Când construiești aplicații enterprise, adesea vrei ca aplicația să aibă teme comune care să ofere un aspect și o experiență consecventă pentru utilizator. Pentru a crea o temă, trebuie să declari zeci până la sute de variabile în App.OnStart. Această declarație crește 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, poți muta următorul cod pe App.OnStart , App.Formulasceea ce reduce timpul de pornire la declarațiile globale de variabile.
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");
Poți muta codul după App.Formulas 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 în setarea Lookups. Aici, este necesară o modificare într-o formulă Lookup pentru a obține informațiile utilizatorului din Office 365 în loc de Dataverse. Trebuie să faci schimbarea doar într-un singur loc, fără să schimbi 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 și trecerea de la tabelul Dataverse Users la conectorul Office 365 fără a necesita modificări ale formulelor răspândite în aplicație.
O altă abordare este optimizarea countRows.
varListItems = CountRows(SampleList)
Cu această Set funcție, trebuie să inițializezi variabila varListItems cu numărul inițial de rânduri din lista de exemple și să o setezi din nou după ce elementele din listă sunt adăugate sau eliminate. Cu formule denumite, pe măsură ce datele se schimbă, variabila varListItems este actualizată automat.
Formulele denumite din App.Formulas proprietate oferă o abordare mai flexibilă și declarativă pentru gestionarea valorilor și calculelor în întreaga aplicație. Acestea oferă avantaje în ceea ce privește independența timpului, actualizările automate, mentenabilitatea și definițiile imuabile, comparativ 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 care afectează disponibilitatea. |
| Actualizări automate | Formulele se actualizează automat atunci când dependențele se modifică. | Variabilele sunt setate o dată la pornire; Ar putea fi necesare actualizări manuale. |
| Capacitate de mentenanță | Formulele centralizate într-o singură locație îmbunătățesc mentenabilitatea. | Variabilele împrăștiate pot necesita găsirea și actualizarea în mai multe locuri. |
| Definiții imuabile | Definițiile formulelor din App.Formulas sunt imuabile. |
Valorile variabilelor pot fi susceptibile la modificări accidentale. |
Funcții definite de utilizator
funcții definite de utilizator în Power Apps Studio îți permit să creezi propriile tale funcții personalizate.
Definiți o formulă sub App.Formulas după cum urmează:
FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula
Codul funcționează astfel:
FunctionNameinvocă funcția.Parametereste numele intrării. Poți include una sau mai multe intrări.DataTypeeste tipul de date pe care argumentul transmis în funcție trebuie să-l potrivească. Tipurile de date disponibile includ Boolean, Color, Data, Date-oră, Dinamic, GUID, Hyperlink, Text și Ora.OutputDataTypeeste tipul de date pentru ieșirea funcției.Formulaeste ieșirea funcției.
Se folosește IfError pentru a implementa gestionarea erorilor în cadrul funcției definite:
// Function to calculate the area of a circle based on the radius
calcAreaOfCircle(radius: Number): Number =
IfError(Pi() * radius * radius, 0);
Apelează funcția definită dintr-un control text sau de etichetă.
calcAreaOfCircle(Int(*TextInput1*.Text))
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. Păstrează-ți Power App-ul curat și organizat pentru performanță mai bună și dezvoltare mai ușoară.
Optimizați colecțiile
Colecțiile sunt structuri temporare de storage a datelor pe care le folosești pentru a stoca și manipula date într-o aplicație Power Apps. Totuși, colectările pot cauza overhead de performanță. 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 această abordare 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
ShowColumnspentru a obține doar anumite coloane. Adăugați funcțiaFilterpentru a obține doar datele relevante.Următoarea funcție exemplu returnează întregul set de date:
ClearCollect(colDemoAccount, Accounts);Comparați această funcție cu următorul cod, care returnează doar înregistrări și coloane specifice:
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. Pentru că colecțiile corespund structurii tabelare a sursei de date și Power Apps, acestea îți permit să interacționezi eficient cu datele, chiar și când ești 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 media și variabilele neutilizate s-ar putea să nu afecteze semnificativ performanța aplicației, este important să îți cureți aplicația prin eliminarea oricăror 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
Pentru a optimiza ecranele și controalele în Power Apps, luați în considerare următoarele bune practici.
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. Această abordare poate forța aplicația să încarce celelalte ecrane în loc să aștepte până când utilizatorul ajunge pe acel ecran. Pentru a rezolva această problemă, folosește variabile, colecții și context de navigare pentru a împărți starea pe ecrane.
Verificatorul de aplicații din Power Apps Studio afișează controale care sunt încrucișate. Verificați periodic Verificatorul de aplicații pentru a remedia această problemă.
În imaginea următoare, controlul Galeriei 1 este referitat încrucișat în Ecranul 2, Control Etichetă 2.
Dacă faci referire la un control de pe primul ecran din aplicație, pe al doilea ecran, nu există nicio scădere de performanță pentru că primul ecran este deja încărcat. Acest comportament este de fapt benefic pentru că aplicația este declarativă în loc să folosească variabile.
Dacă faci referire la controale care încă nu sunt încărcate, cum ar fi primul ecran care face referire la un control numit Label 3 de pe ecranul 3, aplicația încarcă acel ecran în memorie.
Activează DelayOutput pentru controalele text
Setarea DelayOutput , când este setată pe true, înregistrează intrarea utilizatorului după o întârziere de jumătate de secundă. Această întârziere este utilă pentru amânarea operațiunilor costisitoare până când utilizatorul termină de introdus textul, cum ar fi filtrarea atunci când introducerea este folosită în alte formule.
De exemplu, să luăm în considerare o galerie ale cărei elemente sunt filtrate în funcție de ceea ce introduce utilizatorul în controlul TextInput:
Dacă setezi DelayOutput pe fals, care este implicit, galeria filtrează imediat ce orice text este tastat. Dacă ai o galerie cu multe obiecte, reîncărcarea galeriei cu modificări încetinește imediat performanța. E mai bine să aștepți. Acest comportament este practic atunci când folosești
TextInputpentru un șir de căutare sau funcțiaStartsWith.Dacă setezi DelayOutput pe true, există o mică întârziere înainte ca modificările să fie detectate. Această întârziere oferă timp pentru a termina tastatul. Întârzierea funcționează bine cu proprietatea
TextInput.OnChange. Dacă ai acțiuni legate de schimbări, nu vrei să fie declanșate până nu termini de tastat în câmp.
Delegarea și procesarea pe partea de server
Folosirea delegării și procesării pe partea de server permite aplicației tale să gestioneze eficient seturi mari de date prin transferarea operațiunilor către sursa de date.
Delegarea
Delegarea în Power Apps se referă la capacitatea aplicației de a transfera anumite operațiuni către sursa de date subiacente, în loc să proceseze operațiunile în cadrul Power Apps însuși. Folosind delegarea în Power Apps, poți crea aplicații mai eficiente și scalabile, care performanțează bine chiar și în scenarii ce implică seturi de date mari. Fii atent la limitările delegării pentru anumite surse de date și operațiuni și proiectează-ți aplicația în consecință pentru a obține performanțe optime.
Notă
Nu toate funcțiile sunt delegabile. Află mai multe despre delegare în Limitări de interogare: Delegare și limite de interogare.
Delegarea are mai multe avantaje, cum ar fi optimizarea interogărilor și suportul 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ă. Luați în considerare următorul exemplu. În 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, poți reduce timpii de încărcare de la cinci minute la sub 10 secunde fixând datele la sursă.
Procesarea 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, poți crea vizualizări definite printr-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
Optimizarea modului în care aplicația ta interogează datele poate reduce semnificativ timpii de încărcare și poate îmbunătăți răspunsul general.
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ă în aplicația ta, pornește-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ă coloane dacă nu poate determina că sunt folosite. Pentru a forța ECS să păstreze o coloană lipsă, folosiți expresia ShowColumns Power Fx după o referință de colectare sau într-un control.
Evitați să apelați Power Automate pentru a popula o colecție
O practică obișnuită este utilizarea Power Automate pentru a prelua și completa 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 adaugă latență de rețea și un cost de performanță de 0,6 secunde pentru a instanția fluxul Power Automate.
Utilizarea excesivă a fluxurilor Power Automate poate duce, de asemenea, la limitări de execuție și limitare a limitărilor. Evaluează î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. Această problemă poate duce la probleme de performanță, deoarece fiecare interogare suplimentară implică un overhead.
Un apel simplu ca acesta pentru a încărca o colecție poate genera N+1 apeluri către sursa de date:
ClearCollect(MyCollection, OrdersList,
{
LookUp(CustomersList,CustomerID = OrdersList[@CustomerID])
}
)
În contextul aplicațiilor și galeriilor canvas, problema N+1 poate apărea atunci când se lucrează cu surse de date și galerii care afișează înregistrări conexe. 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 schimbă interfața utilizatorului 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ă RelatedDataSource dimensiunea este mică (mai puțin de 500 de înregistrări), stochează-l în cache într-o colecție și folosește colecția pentru a conduce scenariul de interogare Lookup (N+1).
Limitează dimensiunea pachetului
Deși Power Apps optimizează încărcarea aplicațiilor, poți lua măsuri pentru a reduce amprenta aplicațiilor tale. O amprentă redusă este deosebit de importantă pentru utilizatorii dispozitivelor mai vechi sau pentru utilizatorii din zonele cu latență mai mare sau lățime de bandă redusă.
Evaluează media integrată în aplicația ta. Dacă ceva nu este folosit, ștergeți-l.
De exemplu, imaginile încorporate pot fi prea mari. În loc de fișiere PNG, vezi dacă poți folosi imagini SVG. Ai grijă să nu folosești text în imaginile SVG, deoarece fontul trebuie instalat pe client. O soluție când trebuie să afișezi text este să suprapui o etichetă de text peste 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 face, de asemenea, mai ușor pentru mai multe persoane să lucreze simultan la aplicații și limitează "raza de explozie" (cantitatea de testare) atunci când schimbările de aplicație necesită trecerea completă a testului.
Optimizați pentru toți
Funcția ForAll din Power Apps este folosită pentru a itera printr-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 ForAll necorespunzătoare poate face rapid ca aplicația ta să fie mai puțin performantă.
Funcția ForAll este o funcție secvențială singulară, nu o funcție concurentă. Prin urmare, analizează doar o singură înregistrare odată, obține rezultatul, apoi continuă la următoarea înregistrare până parcurge toate înregistrările din domeniul său.
Evită cuibăriatul ForAll. Această practică poate duce la iterații exponențiale și poate afecta semnificativ performanța.
ClearCollect(FollowUpMeetingAttendees.ForAll(ForAll(Distinct(AttendeesList.EmailAddress.Address).Lookup(Attendees))))
Actualizare în loturi a bazei de date
Poți folosi ForAll și Patch actualiza în lot baza de date. Totuși, fii atent când folosești ordinea lui ForAll și Patch.
Următoarea funcție este abordarea mai bună, de exemplu:
Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
{
demoName:"fromCanvas2"
})
);
În timp ce următoarea abordare este mai puțin eficientă:
ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
{
demoName:"test"
})
);