Nota
L'accés a aquesta pàgina requereix autorització. Podeu provar d'iniciar la sessió o de canviar els directoris.
L'accés a aquesta pàgina requereix autorització. Podeu provar de canviar els directoris.
A mesura que les aplicacions de llenç evolucionen per satisfer diferents necessitats empresarials, mantenir un rendiment òptim és fonamental. El maneig de dades, el disseny de la interfície d'usuari i la funcionalitat de l'aplicació requereixen un enfocament acurat de l'optimització del codi.
A mesura que les aplicacions de canvas es tornen més complexes, pots tenir problemes amb la recuperació de dades, la complexitat de les fórmules i la velocitat de renderitzat. Per equilibrar una funcionalitat sòlida amb una interfície d'usuari responsiva, utilitza un enfocament sistemàtic en l'optimització del codi.
Optimització de la fórmula Power Fx
Aquesta secció proporciona les millors pràctiques per optimitzar fórmules de Power Fx.
Amb funció
La With funció avalua una fórmula per a un sol registre. La fórmula pot calcular un valor o realitzar accions, com ara modificar dades o treballar amb una connexió. Utilitzeu-lo With per fer que les fórmules complexes siguin més fàcils de llegir dividint-les en subfórmules amb nom més petites. Aquests valors amb nom actuen com a variables locals simples limitades a l'abast de With.
With és millor que les variables de context o globals perquè és autònom, fàcil d'entendre i funciona en qualsevol context de fórmula declarativa. Aprèn més sobre la funció With.
Funció concurrent
La Concurrent funció permet avaluar diverses fórmules en la mateixa propietat alhora si tenen trucades connector o Dataverse. Normalment, s'avaluen diverses fórmules al mateix temps quan les encadeneu amb l'operador ; (punt i coma). Amb Concurrent, l'aplicació avalua totes les fórmules d'una propietat alhora, fins i tot després d'utilitzar l'operador ; . Aquesta concurrència fa que els usuaris esperin menys temps per obtenir resultats. Quan les trucades de dades no s'inicien fins que finalitzen les trucades anteriors, l'aplicació espera la suma de tots els temps de sol·licitud. Si les trucades de dades s'inicien al mateix temps, l'aplicació només espera el temps de sol·licitud més llarg. Aprèn més sobre la funció concurrent.
Concurrent(
ClearCollect(colAccounts1, Accounts),
ClearCollect(colUsers1, Users),
ClearCollect(colEnvDef1, 'Environment Variable Definitions'),
ClearCollect(colEnvVal1, 'Environment Variable Values')
);
Funció de coalescència
La Coalesce funció avalua els seus arguments en ordre i retorna el primer valor que no està en blanc o una cadena buida. Utilitzeu aquesta funció per substituir un valor en blanc o una cadena buida per un valor diferent, però deixeu els valors de cadena no buits i no buits sense canvis. Si tots els arguments són cadenes en blanc o buides, la funció retorna en blanc.
Coalesce és una bona manera de convertir cadenes buides en valors en blanc. Aprèn més sobre la funció Coalesce.
Aquest exemple requereix value1 i value2 s'ha d'avaluar dues vegades:
If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)
Aquesta funció es pot reduir a:
Coalesce(value1, value2)
Funció IsMatch
La IsMatch funció prova si una cadena de text coincideix amb un patró format per caràcters ordinaris, patrons predefinits o una expressió regular. Aprèn més sobre la funció IsMatch.
Per exemple, aquesta fórmula coincideix amb un número de la Seguretat Social dels Estats Units:
IsMatch(TextInput1.Text, "\d{3}-\d{2}-\d{4}")
Explicació de l'expressió regular:
\\dCoincideix amb qualsevol dígit (0-9).{3}Especifica que el patró de dígits anterior (\d) ha de aparèixer exactament tres vegades.-Coincideix amb el caràcter del guió.{2}Especifica que el patró de dígits anterior (\d) ha d'aparèixer exactament dues vegades.{4}Especifica que el patró de dígits anterior (\d) ha de aparèixer exactament quatre vegades.
Més exemples de IsMatch:
IsMatch(TextInput1.Text, "Hello World")
IsMatch(TextInput1\_2.Text, "(?!^\[0-9\]\\\*$)(?!^\[a-zA-Z\]\\\*$)(\[a-zA-Z0-9\]{8,10})")
Optimitzar l'aplicació OnStart
La OnStart propietat de les aplicacions canvas juga un paper crucial en la definició d'accions que es produeixen quan l'aplicació es llança. Aquesta propietat permet als desenvolupadors d'aplicacions executar tasques d'inicialització globals, configurar variables i realitzar accions que només haurien de passar una vegada durant el procés d'inici de l'aplicació. Entén i utilitza eficaçment la OnStart propietat per crear aplicacions de canvas àgils ràpides i eficients.
Simplifica la App.OnStart funció migrant les configuracions de variables a fórmules amb nom. Les fórmules amb nom, especialment les configurades a l'inici del cicle de vida de l'aplicació, són avantatjoses. Aquestes fórmules gestionen la inicialització de variables basades en trucades de dades, proporcionant una estructura més neta i organitzada per al vostre codi. Aprèn més a Construeix aplicacions de llenç grans i complexes.
Nota
La OnStart propietat és imprescindible. És una llista ordenada de feina que cal fer abans que aparegui la primera pantalla. Com que és tan específic no només sobre el que cal fer, sinó també sobre quan s'ha de fer aquesta feina segons l'ordre, limita les optimitzacions de reordenació i ajornament que d'altra manera es podrien fer.
Pantalla d'inici
Si App.OnStart conté una Navigate crida a una funció, encara que estigui dins d'una If funció i rarament es cridi, l'aplicació ha de completar l'execució abans App.OnStart de mostrar la primera pantalla de l'aplicació.
App.StartScreen és una manera declarativa d'indicar quina pantalla s'ha de mostrar primer, i no bloqueja les optimitzacions.
Si definiu la propietat, StartScreen es mostra la primera pantalla abans que App.OnStart s'hagi completat.
App.StartScreen declara quin objecte de pantalla mostrar primer sense requerir cap preprocessament.
En lloc d'escriure codi com:
App.OnStart = Collect(OrdersCache, Orders);
If(Param("AdminMode") = "1", Navigate(AdminScreen), Navigate(HomeScreen))
Canvieu el codi a:
App.OnStart = Collect(OrdersCache, Orders);
App.StartScreen = If(Param("AdminMode") = "1", AdminScreen, HomeScreen)
Més informació: App.StartScreen: una alternativa declarativa a Navegar a App.OnStart.
Advertiment
Eviteu les dependències entre StartScreen i OnStart. Referenciar una fórmula amb nom que al seu torn fa referència a una variable global pot provocar una condició de raça en què StartScreen no s'aplica correctament.
No creïs dependències entre StartScreen i OnStart. Tot i que l'aplicació bloqueja la referència a variables globals a StartScreen, pots referenciar una fórmula amb nom, que al seu torn fa referència a una variable global. Aquest enfocament podria provocar una condició de cursa en què no s'aplica correctament StartScreen .
Fórmules amb nom
Les fórmules anomenades són estàtiques o constants que es poden definir en App.Formulas. Un cop declarats a App.Formulas, es poden utilitzar a qualsevol lloc de l'aplicació, i els seus valors sempre es mantenen actualitzats. Les fórmules amb nom a Power Apps et permeten definir valors o conjunts de valors que la plataforma gestiona i actualitza automàticament. Aquesta funcionalitat trasllada la responsabilitat del càlcul i manteniment del valor del desenvolupador a Power Apps, agilitzant el procés de desenvolupament. Les fórmules amb nom a Power Apps són una funció poderosa que pot millorar significativament el rendiment i la mantenibilitat de les aplicacions.
Les fórmules amb nom també ajuden a l'hora de declarar temes d'aplicacions. Quan construeixes aplicacions empresarials, sovint vols que l'aplicació tingui temes comuns que proporcionin un aspecte i una experiència d'usuari coherents. Per crear un tema, cal declarar desenes o centenars de variables a App.OnStart. Aquesta declaració augmenta la longitud del codi i el temps d'inicialització de l'aplicació.
Els controls moderns també poden ajudar significativament amb la tematització i ajudar a reduir la lògica escrita del client per gestionar la tematització. Els controls moderns estan actualment en versió preliminar.
Per exemple, pots moure el codi següent a App.OnStartApp.Formulas, cosa que redueix el temps d'inici en declaracions globals de variables.
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");
Pots moure el codi a App.Formulas la següent manera:
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 altre exemple és en l'escenari.Lookups Aquí, cal un canvi en una fórmula Lookup per obtenir la informació d'usuari de Office 365 en lloc de Dataverse. Només cal fer el canvi en un lloc, sense canviar el codi a tot arreu.
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');
Aquestes fórmules encarnen l'essència del càlcul. Articulen el procés per determinar UserEmail, UserInfoUserTitle i UserPhone basar-se en altres valors. Aquesta lògica està encapsulada, permetent una utilització generalitzada a tota l'aplicació i es pot modificar en una ubicació singular. L'adaptabilitat s'estén fins a canviar de la taula Dataverse Users al connector d'Office 365 sense necessitat d'alterar les fórmules repartides per tota l'aplicació.
Un altre enfocament és optimitzar countRows.
varListItems = CountRows(SampleList)
Amb la Set funció, has d'inicialitzar la variable varListItems amb el recompte inicial de files a la llista d'exemple i tornar-la a configurar després d'afegir o eliminar els elements de la llista. Amb les fórmules nomenades, a mesura que canvien les dades, la varListItems variable s'actualitza automàticament.
Les fórmules anomenades a la App.Formulas propietat proporcionen un enfocament més flexible i declaratiu per gestionar valors i càlculs a tota l'aplicació. Ofereixen avantatges en termes d'independència temporal, actualitzacions automàtiques, mantenibilitat i definicions immutables en comparació amb confiar exclusivament en App.OnStart.
| Aspecte | Fórmules amb nom (App.Formulas) | App.OnStart |
|---|---|---|
| Independència de temps | Les fórmules estan disponibles instantàniament i es poden calcular en qualsevol ordre. | Les variables poden introduir dependències temporals que afecten la disponibilitat. |
| Actualitzacions automàtiques | Les fórmules s'actualitzen automàticament quan canvien les dependències. | Les variables es configuren una vegada durant l'arrencada; Potser caldran actualitzacions manuals. |
| Manteniment | Les fórmules centralitzades en una ubicació milloren el manteniment. | Les variables disperses poden requerir trobar-les i actualitzar-les en diversos llocs. |
| Definicions immutables | Les definicions de fórmules a App.Formulas són immutables. |
Els valors de les variables podrien ser susceptibles a canvis accidentals. |
Funcions definides per l'usuari
funcions definides per l'usuari a Power Apps Studio et permeten crear les teves pròpies funcions personalitzades.
Definiu una fórmula de la App.Formulas següent manera:
FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula
El codi funciona de la manera següent:
FunctionNameinvoca la funció.Parameterés el nom de l'entrada. Pots incloure una o més entrades.DataTypeés el tipus de dades que l'argument passat a la funció ha de coincidir. Els tipus de dades disponibles inclouen Boolean, Color, Data, Hora, Dinàmic, GUID, Enllaç, Text i Hora.OutputDataTypeés el tipus de dades per a la sortida de la funció.Formulaés la sortida de la funció.
Utilitza IfError per implementar la gestió d'errors dins de la funció definida:
// Function to calculate the area of a circle based on the radius
calcAreaOfCircle(radius: Number): Number =
IfError(Pi() * radius * radius, 0);
Crida la funció definida des d'un control de text o d'etiquetes.
calcAreaOfCircle(Int(*TextInput1*.Text))
Optimitzar variables
Les variables defineixen i defineixen els valors locals i globals que utilitzeu a tota l'aplicació. Tot i que són convenients, l'ús de massa variables pot fer que l'aplicació sigui menys eficient.
L'exemple següent mostra com definir una variable per a cada atribut d'un objecte, que requereix utilitzar Set per a cada propietat.
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);
Un enfocament més eficient és utilitzar la propietat només quan la necessiteu:
Set(varEmployee, Office365Users.MyProfile())
"Welcome " & varEmployee.DisplayName
Utilitzeu les variables de context i les variables globals amb prudència. Si l'abast d'una variable va més enllà d'una sola pantalla, utilitzeu variables globals en lloc de variables de context.
Massa variables no utilitzades augmenten l'ús de memòria i poden alentir la inicialització de l'aplicació. Els recursos s'assignen per a aquestes variables encara que no les utilitzeu. Les variables no utilitzades també afegeixen complexitat a la lògica de l'aplicació. Mantingues la teva Power App neta i organitzada per a un millor rendiment i un desenvolupament més fàcil.
Optimitza les col·leccions
Les col·leccions són dades temporals storage estructures que utilitzes per emmagatzemar i manipular dades en una aplicació de Power Apps. Tanmateix, les col·leccions poden causar sobrecàrrega de rendiment. Limiteu l'ús de les col·leccions i utilitzeu-les només quan sigui necessari.
// Use this pattern
ClearCollect(colErrors, {Text: gblErrorText, Code: gblErrorCode});
// Do not use this pattern
Clear(colErrors);
Collect(colErrors, {Text: gblErrorText, Code: gblErrorCode});
Per comptar registres d'una col·lecció local, utilitzeu CountIf en lloc de Count(Filter()).
Considera aquest enfocament quan treballis amb col·leccions:
Limiteu la mida i el nombre de col·leccions. Com que les col·leccions són locals a l'aplicació, s'emmagatzemen a la memòria del dispositiu mòbil. Com més dades tinguin les col·leccions o més col·leccions utilitzeu, pitjor serà el rendiment. Utilitzeu la
ShowColumnsfunció per obtenir només columnes específiques. Afegiu laFilterfunció per obtenir només dades rellevants.La següent funció d'exemple retorna tot el conjunt de dades:
ClearCollect(colDemoAccount, Accounts);Compareu aquesta funció amb el codi següent, que només retorna registres i columnes específiques:
ClearCollect(colAcc, ShowColumns( Filter(Accounts, !IsBlank('Address 1: City')), "name","address1_city"))Aquest exemple retorna el conjunt de dades següent:
Definiu una freqüència d'actualització de la font de dades. Si afegiu registres nous a la col·lecció, actualitzeu-la o recopileu-la per obtenir els registres nous o modificats. Si diversos usuaris actualitzen la font de dades, actualitzeu la col·lecció per obtenir els registres nous o canviats. Més trucades d'actualització signifiquen més interacció amb el servidor.
Emmagatzemar dades en memòria cau en col·leccions i variables
Una col·lecció és una variable de taula que emmagatzema files i columnes de dades, no només un element de dades. Les col·leccions són útils per dos motius principals: agregar dades abans d'enviar-les a la font de dades i emmagatzemar la informació en memòria cau per evitar consultes freqüents. Com que les col·leccions coincideixen amb l'estructura tabular de la font de dades i de Power Apps, et permeten interactuar amb les dades de manera eficient, fins i tot quan estàs fora de línia.
// Clear the contents of EmployeeCollection, it already contains data
ClearCollect(
colEmployee,
{
Id: "1",
Name: "John",
Department: "IT"
},
{
Id: "2",
Name: "Nestor",
Department: "IT"
}
)
Suprimir variables i suports no utilitzats
Tot i que els mitjans i variables no utilitzats poden no afectar significativament el rendiment de l'aplicació, és important netejar la teva aplicació eliminant qualsevol contingut o variable no utilitzada.
Els fitxers multimèdia no utilitzats augmenten la mida de l'aplicació, cosa que pot alentir el temps de càrrega de l'aplicació.
Les variables no utilitzades augmenten l'ús de memòria i poden alentir lleugerament la inicialització de l'aplicació. Els recursos s'assignen per a aquestes variables encara que no s'utilitzin. Massa variables no utilitzades també poden fer que la lògica de l'aplicació sigui més complexa.
Utilitzeu el Verificador d'aplicacions per revisar els contingut multimèdia i les variables no utilitzats.
Optimitzar pantalles i controls
Per optimitzar pantalles i controls a Power Apps, considera les següents bones pràctiques.
Evitar els controls de referències creuades
Els controls que fan referència als controls d'altres pantalles poden alentir la càrrega i la navegació de l'aplicació. Aquest enfocament pot obligar l'aplicació a carregar les altres pantalles en lloc d'esperar que l'usuari hi vagi. Per resoldre aquest problema, utilitza variables, col·leccions i context de navegació per compartir estat entre pantalles.
El verificador d'aplicacions a Power Apps Studio mostra controls que es creuen. Reviseu el verificador d'aplicacions regularment per solucionar aquest problema.
A la imatge següent, el control Galeria 1 es creua a la Pantalla 2, control Etiqueta 2.
Si consultes un control de la primera pantalla de l'aplicació a la segona pantalla, no hi ha cap pèrdua de rendiment perquè la primera pantalla ja està carregada. Aquest comportament és en realitat beneficiós perquè l'aplicació és declarativa en lloc d'utilitzar variables.
Si consultes controls que encara no estan carregats, com la primera pantalla que fa referència a un control anomenat Label 3 de la pantalla 3, l'aplicació carrega aquesta pantalla a la memòria.
Habilita DelayOutput per als controls de text
La configuració DelayOutput , quan està configurada com a true, registra l'entrada de l'usuari després d'un retard de mig segon. Aquest retard és útil per ajornar operacions costoses fins que l'usuari acabi d'introduir text, com ara filtrar quan s'utilitza l'entrada en altres fórmules.
Per exemple, considerem una galeria els Elements de la qual es filtren segons el que l'usuari introdueixi al control TextInput:
Si poses DelayOutput en false, que és el predeterminat, la galeria filtra tan bon punt es escriu qualsevol text. Si tens una galeria amb molts elements, recarregar-la amb canvis immediatament fa que el rendiment sigui més lent. És millor esperar. Aquest comportament és pràctic quan utilitzes la
TextInputcadena de cerca o laStartsWithfunció.Si poses DelayOutput a true, hi ha un petit retard abans que es detectin els canvis. Aquest retard dóna temps per acabar d'escriure. El retard funciona bé amb la
TextInput.OnChangepropietat. Si tens accions relacionades amb canvis, no vols que s'activin fins que acabis d'escriure al camp.
Delegació i processament al costat del servidor
L'ús de delegació i processament al costat del servidor permet que la teva aplicació gestioni grans conjunts de dades de manera eficient descarregant les operacions a la font de dades.
Delegació
La delegació a Power Apps fa referència a la capacitat de l'aplicació per descarregar certes operacions a la font de dades subjacent en lloc de processar-les dins de Power Apps mateix. Mitjançant la delegació a Power Apps, pots crear aplicacions més eficients i escalables que funcionen bé fins i tot en escenaris que impliquen grans conjunts de dades. Sigues conscient de les limitacions de delegació per a fonts de dades i operacions específiques, i dissenya la teva aplicació en conseqüència per aconseguir un rendiment òptim.
Nota
No totes les funcions són delegables. Aprèn més sobre la delegació a Limitacions de consultes: Delegació i límits de consulta.
La delegació té diversos avantatges, com l'optimització de consultes i el suport per a grans conjunts de dades. A més, si les dades d'origen canvien amb freqüència, la delegació ajuda a mantenir les dades actualitzades.
Reduir les crides d'API a la font de dades
De vegades, pot semblar convenient crear col·leccions realitzant unions dins de l'aplicació de llenç. Tingueu en compte l'exemple següent. En l'exemple, hi ha dues taules: Conductors i Camions. El codi crea una col·lecció de conductors i detalls del camió i, per a cada camió, truca al conductor propietari del camió.
// 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)));
Realitzar aquesta unió a l'aplicació de llenç pot generar moltes trucades a la font de dades, cosa que comporta temps de càrrega lents.
Un millor enfocament és:
// 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'
)
)
En l'escenari en temps real, pots reduir els temps de càrrega de cinc minuts a menys de 10 segons fixant les dades a la font.
Processament al costat del servidor
Diferents fonts de dades, com SQL i Dataverse, us permeten delegar el processament de dades, com ara filtres i cerques, a la font de dades. A SQL Server, pots crear vistes definides per una consulta. En Dataverse, podeu crear connectors de codi baix per processar dades al servidor i retornar només els resultats finals a la vostra aplicació de llenç.
Delegar el processament de dades al servidor pot millorar el rendiment, reduir el codi del client i facilitar el manteniment de l'aplicació.
Obteniu més informació sobre els connectors a Dataverse.
Optimitzar els patrons de dades de consulta
Optimitzar com la teva aplicació consulta les dades pot reduir significativament els temps de càrrega i millorar la capacitat de resposta global.
Utilitzar la selecció explícita de columnes
La funció de selecció explícita de columnes (ECS) està activada de manera predeterminada per a totes les aplicacions noves. Si no està activada a la teva aplicació, activa-la. L'ECS redueix automàticament el nombre de columnes recuperades només a les que s'utilitzen a l'aplicació. Si l'ECS no està activat, és possible que obtingueu més dades de les que necessiteu, cosa que pot afectar el rendiment. De vegades, quan una aplicació obté dades a través de col·leccions, es pot perdre l'origen original d'una columna. L'ECS elimina columnes si no pot determinar que s'utilitzen. Per forçar l'ECS a mantenir una columna que falta, utilitza l'expressió ShowColumns Power Fx després d'una referència de col·lecció o en un control.
Evita trucar a Power Automate per omplir una col·lecció
Una pràctica habitual és utilitzar Power Automate per obtenir i omplir col·leccions a Power Apps. Tot i que aquest enfocament és vàlid, hi ha situacions en què pot no ser l'opció més eficient. Cridar Power Automate afegeix latència de xarxa i un cost de rendiment de 0,6 segons per instanciar el flux de Power Automate.
L'ús excessiu dels fluxos de Power Automate també pot provocar límits d'execució i limitacions. Avalua sempre els compromisos entre la latència de la xarxa i el cost de rendiment.
Elimina el problema N+1
El problema N+1 és un problema comú en les consultes de bases de dades on, en lloc d'obtenir totes les dades necessàries en una sola consulta, es fan diverses consultes addicionals per recuperar dades relacionades. Aquest problema pot provocar problemes de rendiment, ja que cada consulta addicional comporta sobrecàrrega.
Una crida senzilla com aquesta per carregar una col·lecció pot generar N+1 trucades a la font de dades:
ClearCollect(MyCollection, OrdersList,
{
LookUp(CustomersList,CustomerID = OrdersList[@CustomerID])
}
)
En el context de les aplicacions i galeries de canvas, el problema N+1 pot sorgir quan es treballa amb fonts de dades i galeries que mostren registres relacionats. El problema normalment es produeix quan es fan més consultes per a cada element que es mostra a la galeria, cosa que provoca un coll d'ampolla de rendiment.
Utilitza objectes Vista a SQL Server per evitar el problema de N+1 consultes, o canvia la interfície d'usuari per evitar activar l'escenari N+1.
Dataverse Obté automàticament les dades necessàries de les taules relacionades i podeu seleccionar les columnes de les taules relacionades.
ThisItem.Account.'Account Name'
Si RelatedDataSource la mida és petita (menys de 500 registres), emmagatzema-la en memòria cau en una col·lecció i utilitza la col·lecció per impulsar l'escenari de consulta de cerca (N+1).
Limita la mida del paquet
Tot i que Power Apps optimitza la càrrega d'aplicacions, pots prendre mesures per reduir la presència de les teves aplicacions. Una empremta reduïda és especialment important per a usuaris de dispositius antics o en llocs on hi ha més latència o amplada de banda reduïda.
Avalua els mitjans integrats a la teva aplicació. Si alguna cosa no s'utilitza, suprimeix-la.
Per exemple, les imatges incrustades podrien ser massa grans. En lloc de fitxers PNG, comproveu si podeu utilitzar imatges SVG. Vés amb compte amb l'ús de text en imatges SVG perquè la font ha d'estar instal·lada al client. Una solució alternativa quan necessites mostrar text és superposar una etiqueta de text sobre una imatge.
Avalueu si la resolució és adequada per al factor de forma. La resolució d'una aplicació mòbil no ha de ser tan alta com la d'una aplicació d'escriptori. Experimenteu per obtenir l'equilibri adequat de qualitat i mida de la imatge.
Si teniu pantalles no utilitzades, suprimiu-les. Aneu amb compte de no suprimir pantalles ocultes que només utilitzen els creadors d'aplicacions o els administradors.
Avalueu si esteu intentant encaixar massa fluxos de treball en una aplicació. Per exemple, teniu pantalles d'administració i pantalles de client a la mateixa aplicació? Si és així, considereu dividir-los en aplicacions individuals. Aquest enfocament també facilita que diverses persones treballin en les aplicacions al mateix temps, i limita el "radi de l'explosió" (quantitat de proves) quan els canvis d'aplicació requereixen un examen complet.
Optimitza per a tots
La funció ForAll en Power Apps s'utilitza per iterar a través d'una taula de registres i aplicar una fórmula o conjunt de fórmules a cada registre. Tot i que la funció en si és versàtil, un ús ForAll incorrecte pot fer que la teva aplicació perdi rendiment ràpidament.
La ForAll funció és una funció seqüencial singular en lloc d'una funció concurrent. Per tant, només mira un registre a la vegada, obté el resultat i després continua al següent registre fins que passa per tots els registres del seu abast.
Evita fer niu ForAll. Aquesta pràctica pot conduir a iteracions exponencials i afectar significativament el rendiment.
ClearCollect(FollowUpMeetingAttendees.ForAll(ForAll(Distinct(AttendeesList.EmailAddress.Address).Lookup(Attendees))))
Actualització per lots de la base de dades
Pots utilitzar ForAll i Patch actualitzar la base de dades per lots. Tanmateix, vés amb compte quan utilitzis l'ordre de ForAll i Patch.
La funció següent és l'enfocament millor, per exemple:
Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
{
demoName:"fromCanvas2"
})
);
Mentre que l'enfocament següent és menys eficient:
ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
{
demoName:"test"
})
);