Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
A medida que las aplicaciones de lienzo evolucionan para satisfacer diferentes necesidades empresariales, es fundamental mantener un rendimiento óptimo. El manejo de datos, el diseño de la interfaz de usuario y la funcionalidad de la aplicación requieren un enfoque cuidadoso para la optimización del código.
Cuando las aplicaciones de lienzo se vuelven más complejas, puede tener problemas con la recuperación de datos, la complejidad de las fórmulas y la velocidad de representación. Equilibrar una funcionalidad sólida y una interfaz de usuario receptiva significa que necesita un enfoque sistemático para la optimización del código.
Power Fx optimización de fórmulas
Función With
La función With
evalúa una fórmula para un solo registro. La fórmula puede calcular un valor o realizar acciones, como modificar datos o trabajar con una conexión. Utilice With
para facilitar la lectura de fórmulas complejas dividiéndolas en subfórmulas más pequeñas con nombre. Estos valores nombrados actúan como variables locales simples confinadas al alcance de With
. Es preferible usar With
que variables de contexto o globales, ya que es autónomo, fácil de entender y puede usarse en cualquier contexto de fórmula declarativa.
Más información acerca de la función With
.
Función Concurrent
La función Concurrent
permite evaluar, de forma simultánea, varias fórmulas especificadas dentro de la misma propiedad si tienen conector o llamadas de Dataverse. Normalmente, se evalúan varias fórmulas al mismo tiempo cuando se encadenan con el operador ;
(punto y coma). Con Concurrent
, la aplicación evalúa todas las fórmulas de una propiedad al mismo tiempo, incluso después de usar el operador ;
. Esta simultaneidad significa que los usuarios esperan menos los resultados. Si las llamadas de datos no se inician hasta que terminan las llamadas anteriores, la aplicación debe esperar la suma de todos los tiempos de solicitud. Si las llamadas de datos se inician al mismo tiempo, la aplicación solo debe esperar el tiempo de solicitud más largo.
Más información acerca de la función Concurrent
.
Concurrent(
ClearCollect(colAccounts1, Accounts),
ClearCollect(colUsers1, Users),
ClearCollect(colEnvDef1, 'Environment Variable Definitions'),
ClearCollect(colEnvVal1, 'Environment Variable Values')
);
Función Coalesce
La función Coalesce
evalúa sus argumentos en orden y devuelve el primer valor que no sea blank o una cadena vacía. Use esta función para reemplazar los valores blank o las cadenas vacías por un valor diferente dejando sin cambios los valores que no sean blank o cadenas vacías. Si todos los argumentos están en blanco o son cadenas vacías, la función devuelve vacío.
Coalesce
es una buena manera de convertir cadenas vacías en valores en blanco.
Por ejemplo:
If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)
Requiere que el valor 1 y el valor 2 se evalúen dos veces. Esta función se puede reducir a:
Coalesce(value1, value2)
Función IsMatch
La función IsMatch
comprueba si una cadena de texto coincide con un patrón que puede incluir caracteres normales, patrones predefinidos o una expresión regular.
Más información acerca de la función IsMatch
.
Por ejemplo, esta fórmula establece una coincidencia con un número de la Seguridad Social de Estados Unidos:
IsMatch(TextInput1.Text, "\d{3}-\d{2}-\d{4}")
Explicación de la expresión regular:
\\d
Coincide con cualquier dígito (0-9).
{3}
Especifica que el patrón de dígitos anterior (\d) debe aparecer exactamente tres veces.
-
Coincide con el carácter guion.
{2}
Especifica que el patrón de dígitos anterior (\d) debe aparecer exactamente dos veces.
{4}
Especifica que el patrón de dígitos anterior (\d) debe aparecer exactamente cuatro veces.
Más ejemplos de IsMatch
:
IsMatch(TextInput1.Text, "Hello World")
IsMatch(TextInput1\_2.Text, "(?!^\[0-9\]\\\*$)(?!^\[a-zA-Z\]\\\*$)(\[a-zA-Z0-9\]{8,10})")
Optimizar OnStart de la aplicación
La propiedad OnStart
de las aplicaciones de lienzo desempeña un papel crucial a la hora de definir las acciones que se producen cuando se inicia la aplicación. Esta propiedad permite a los desarrolladores de aplicaciones ejecutar tareas de inicialización globales, configurar variables y realizar acciones que deberían ocurrir solo una vez durante el proceso de inicio de la aplicación. Comprender y utilizar eficazmente la propiedad OnStart
es esencial para crear aplicaciones de lienzo receptivas y eficientes.
Un enfoque recomendado es simplificar la función App.OnStart
migrando configuraciones de variables a fórmulas con nombre. Las fórmulas con nombre, especialmente aquellas configuradas al principio del ciclo de vida de la aplicación, resultan ventajosas. Estas fórmulas manejan la inicialización de variables basadas en llamadas de datos, proporcionando una estructura más limpia y organizada para su código. Más detalles Crea aplicaciones de lienzo grandes y complejas - Power Apps | Microsoft Learn.
Nota
La propiedad OnStart
es imperativa. Es una lista ordenada de trabajo que debe realizarse antes de que se muestre la primera pantalla. Porque es tan específico no solo acerca de qué hay que hacer, sino también cuándo se debe hacer ese trabajo en función del orden, limita la reordenación y el aplazamiento de optimizaciones que de otro modo podrían realizarse.
Iniciar pantalla
Si App.OnStart
contiene una llamada de función Navigate
, incluso si está en una función If
que se llama raramente, debemos completar la ejecución de App.
OnStart
antes de mostrar la primera pantalla de la aplicación.
App.StartScreen
es la nueva forma declarativa de indicar qué pantalla se debe mostrar primero, que no bloquea las optimizaciones.
Al configurar la propiedad StartScreen
se muestra la primera pantalla antes de que se complete App.OnStart
.
App.StartScreen declares
qué objeto de pantalla mostrar primero sin requerir ningún procesamiento previo.
En lugar de escribir código como:
App.OnStart = Collect(OrdersCache, Orders);
If(Param("AdminMode") = "1", Navigate(AdminScreen), Navigate(HomeScreen))
Cambio del código a:
App.OnStart = Collect(OrdersCache, Orders);
App.StartScreen = If(Param("AdminMode") = "1", AdminScreen, HomeScreen)
Consulte <https://Power Apps.microsoft.com/es-es/blog/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart/>para más detalles.
Advertencia
Evite dependencias entre StartScreen
y OnStart
. La referencia a una fórmula con nombre que, a su vez, hace referencia a una variable global, puede provocar una condición de carrera en la que StartScreen
no se aplica correctamente.
Nota: No deberíamos tener dependencias entre StartScreen y OnStart. Bloqueamos la referencia a variables globales en StartScreen, pero podemos hacer referencia a una fórmula con nombre, que a su vez hace referencia a una variable global, y que puede provocar una condición de carrera en la que StartScreen no se aplique correctamente.
Fórmulas con nombre
Las fórmulas con nombre son estáticas o constantes que se pueden definir en la sección App.Formulas. Una vez declarados en App.Formulas, se pueden usar en cualquier parte de la aplicación y su valor siempre permanece actualizado. Las fórmulas con nombre en Power Apps permiten la definición de valores o conjuntos de valores que la plataforma administra y actualiza automáticamente. Esta funcionalidad transfiere la responsabilidad del cálculo del valor y el mantenimiento del desarrollador a Power Apps, agilizando el proceso de desarrollo. Las fórmulas con nombre en Power Apps son una potente funcionalidad que puede mejorar significativamente el rendimiento y la capacidad de mantenimiento de la aplicación.
Las fórmulas con nombre también pueden tratar la declaración de temas de aplicaciones. En muchos casos en los que se crean aplicaciones empresariales, queremos que la aplicación tenga temas comunes para brindar una apariencia y una experiencia de usuario consistentes. Para crear un tema, hay decenas y centenas de variables que deben declararse en App OnStart. Esto aumentó la longitud del código y el tiempo de inicialización de la aplicación.
Los controles modernos también pueden ayudar significativamente con la tematización y ayudar a reducir la lógica personalizada para manejar la tematización. Los controles modernos se encuentran actualmente en versión preliminar.
Por ejemplo, el siguiente código en App.OnStart
se puede mover a App.Formulas
, reduciendo así el tiempo de inicio de las declaraciones de variables globales.
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");
El código se puede mover a App.Formulas de la siguiente 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";
Otro ejemplo es en la configuración de Lookups
. Aquí, se requiere un cambio en una fórmula de búsqueda para obtener la información del usuario de Office 365, en lugar de Dataverse. Solo hay un lugar donde se requiere el cambio sin cambiar el código en todas partes.
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');
Estas fórmulas representan la esencia del cálculo. Expresan el proceso para determinar UserEmail
, UserInfo
, UserTitle
y UserPhone
en función de otros valores. Esta lógica está encapsulada, lo que permite una utilización generalizada en toda la aplicación y se puede modificar en una ubicación singular. La adaptabilidad se extiende al cambio de la tabla de usuarios de Dataverse al conector de Office 365 sin necesidad de realizar modificaciones en las fórmulas repartidas por la aplicación.
Otro enfoque es optimizar countRows
.
varListItems = CountRows(SampleList)
Con la función Set
, la variable varListItems
deberá inicializarse con el recuento inicial de filas en la lista de muestra y configurarse nuevamente después de agregar o eliminar los elementos de la lista. Con las fórmulas con nombre, a medida que cambian los datos, las variables varListitems se actualizan automáticamente.
Las fórmulas con nombre en la propiedad App.Formulas
brindan un enfoque más flexible y declarativo para administrar valores y cálculos en toda la aplicación, lo que ofrece ventajas en términos de independencia temporal, actualizaciones automáticas, mantenibilidad y definiciones inmutables en comparación con depender únicamente de App.OnStart
.
Aspecto | Fórmulas con nombre (App.Formulas) | App.OnStart |
---|---|---|
Independencia temporal | Las fórmulas están disponibles al instante y se pueden calcular en cualquier orden. | Las variables pueden introducir dependencias de tiempo, lo que afecta la disponibilidad. |
Actualizaciones automáticas | Las fórmulas se actualizan automáticamente cuando cambian las dependencias. | Las variables se establecen una vez durante el arranque; puede ser necesario actualizarlas manualmente. |
Mantenimiento | Las fórmulas centralizadas en una ubicación mejoran la mantenibilidad. | Las variables dispersas pueden requerir búsqueda y actualización en varios lugares. |
Definiciones inmutables | Las definiciones de fórmulas en App.Formulas son inmutables. | Los valores variables pueden ser susceptibles a cambios accidentales. |
Funciones definidas por el usuario
Funciones definidas por el usuario en Power Apps Authoring Studio permiten a los usuarios crear su propia función personalizada.
Para usar esta característica, en la configuración de vista previa, active Función definida por el usuario (UDF). La funcionalidad de vista previa no debe usarse en producción, por lo que está deshabilitada de forma predeterminada, pero pronto estará disponible de forma general.
Defina una fórmula en App.Formulas
de la siguiente manera:
FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula
El código funciona así:
FunctionName
se utiliza para invocar la funciónParameter
es el nombre de la entrada. Se permiten una o más entradasDataType
es un argumento que se pasa a la función y debe coincidir con este tipo de datos. Los tipos de datos disponibles incluyen booleano, color, fecha, fecha y hora, dinámico, GUID, hipervínculo, texto y tiempoOutputDataType
es el tipo de datos en el que estará la salida de la funciónFormula
es la salida de la función
// Function to calculate the area of a circle based on the radius
calcAreaOfCircle(radius: Number): Number =
IfError(Pi() * radius * radius, 0);
Use IfError
para implementar la gestión de errores dentro de la función definida.
Llame a la función definida desde el control de texto/etiqueta.
calcAreaOfCircle(Int(*TextInput1*.Text))
Nota
Se trata de una función experimental y está sujeta a cambios. Algunos tipos de datos, como registros y filtros, aún no se admiten.
Optimizar variables
Las variables definen y establecen los valores locales y globales que se usan en toda la aplicación. Si bien son convenientes, el uso de demasiadas variables puede hacer que su aplicación sea menos eficiente.
En el ejemplo siguiente se muestra cómo establecer una variable para cada atributo de un objeto, lo que requiere el uso Set
For Each.
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 enfoque más eficiente es usar la propiedad solo cuando la necesite:
Set(varEmployee, Office365Users.MyProfile())
"Welcome " & varEmployee.DisplayName
Utilice sabiamente las variables de contexto y las variables globales. Si el ámbito de una variable va más allá de una sola pantalla, utilice variables globales en lugar de variables de contexto.
Demasiadas variables sin usar aumentan el uso de memoria y pueden ralentizar la inicialización de la aplicación. Los recursos se asignan para estas variables incluso si no las usa. Las variables no utilizadas también agregan complejidad a la lógica de la aplicación. Si bien es posible que el impacto no sea grave, es una buena práctica mantener su Power App limpio y organizado para un mejor rendimiento y un desarrollo más fácil.
Optimizar colecciones
Las colecciones son estructuras de almacenamiento de datos temporales que se utilizan para almacenar y manipular datos en una Power Apps aplicación. Sin embargo, las colecciones pueden causar gastos generales de rendimiento si se usan demasiado. Limite el uso de colecciones y utilícelas solo cuando sea necesario.
// Use this pattern
ClearCollect(colErrors, {Text: gblErrorText, Code: gblErrorCode});
// Do not use this pattern
Clear(colErrors);
Collect(colErrors, {Text: gblErrorText, Code: gblErrorCode});
Para contar registros en una colección local, use CountIf
en lugar de Count(Filter())
.
Considere esta guía cuando trabaje con colecciones:
Limite el tamaño y el número de colecciones. Dado que las colecciones son locales para la aplicación, se almacenan en la memoria del dispositivo móvil. Cuantas más colecciones de datos contengan, o cuantas más colecciones use, peor será el rendimiento. Use la función ShowColumns
para obtener solo columnas específicas. Agregue la función Filter
para obtener solo los datos relevantes.
La siguiente función de ejemplo devuelve el conjunto de datos completo.
ClearCollect(colDemoAccount, Accounts);
Compare esto con el código siguiente, que devuelve solo registros y columnas específicos:
ClearCollect(colAcc,
ShowColumns(
Filter(Accounts, !IsBlank('Address 1: City')),
"name","address1_city"))
En este ejemplo se devuelve el siguiente conjunto de datos:
Establezca una frecuencia de actualización de la fuente de datos. Si agrega nuevos registros a la colección, actualícela o recopile para obtener los registros nuevos o modificados. Si varios usuarios actualizan el origen de datos, actualice la colección para obtener los registros nuevos o modificados. Más llamadas de actualización significan más interacción con el servidor.
Almacene datos en caché en colecciones y variables
Una colección es una variable de tabla que almacena filas y columnas de datos, no solo un único elemento de datos. Las colecciones son útiles por dos razones principales: agregar datos antes de enviarlos al origen de datos y almacenar información en caché para evitar consultas frecuentes. Como las colecciones coinciden con la estructura tabular del origen de datos y Power Apps, le permiten interactuar con los datos de manera eficaz, incluso cuando no está conectado.
// Clear the contents of EmployeeCollection, it already contains data
ClearCollect(
colEmployee,
{
Id: "1",
Name: "John",
Department: "IT"
},
{
Id: "2",
Name: "Nestor",
Department: "IT"
}
)
Eliminar variables y medios no utilizados
Si bien es posible que los medios y las variables no utilizados no tengan un impacto significativo en el rendimiento de la aplicación, es importante limpiarla eliminando los medios o variables no utilizados.
Los archivos multimedia no utilizados aumentan el tamaño de la aplicación, lo que puede ralentizar los tiempos de carga de la aplicación.
Las variables no utilizadas aumentan el uso de memoria y pueden ralentizar ligeramente la inicialización de la aplicación. Los recursos se asignan a estas variables aunque no se utilicen. Demasiadas variables sin usar también pueden hacer que la lógica de la aplicación sea más compleja.
Utilice App Checker para revisar los medios y variables no utilizados.
Optimizar las pantallas y los controles
Evitar controles cruzados
Los controles que hacen referencia a controles en otras pantallas pueden ralentizar la carga y navegación de la aplicación. Hacer esto puede forzar a la aplicación a cargar las otras pantallas inmediatamente, en lugar de esperar hasta que el usuario vaya a esa pantalla. Para solucionar este problema, use variables, colecciones y contexto de navegación para compartir el estado entre pantallas en su lugar.
El comprobador de aplicaciones en Power Apps Studio muestra los controles con referencias cruzadas. Revise el Comprobador de aplicaciones con regularidad para solucionar este problema.
A continuación se muestra un ejemplo de controles con referencias cruzadas. En la imagen siguiente, se hace una referencia cruzada al control Gallery 1 en el control Screen 2, Label 2.
Si hace referencia a un control de la primera pantalla de la aplicación en la segunda pantalla, no se producirá ningún impacto en el rendimiento porque la primera pantalla ya está cargada. En realidad, esto puede ser algo bueno porque la aplicación es declarativa en lugar de usar variables.
Si hace referencia a controles que aún no se han cargado, como la primera pantalla que hace referencia a un control nombrado Label 3
desde la pantalla 3, la aplicación carga esa pantalla en la memoria.
Habilitar DelayOutput para controles de texto
DelayOutput: cuando se establece en true, la entrada del usuario se registra después de un retraso de medio segundo. Esto es útil para retrasar operaciones costosas hasta que el usuario termine de introducir texto, como el filtrado cuando la entrada se utiliza en otras fórmulas.
Por ejemplo, para una galería cuyos elementos se filtran en función de lo que el usuario escribe en el control TextInput:
Con DelayOutput establecido en false, que es el valor predeterminado, la galería se filtra tan pronto como se escribe cualquier texto. Si tiene una galería con muchos elementos, volver a cargar la galería con los cambios de inmediato ralentiza el rendimiento. Es mejor esperar un poco. Esto es práctico cuando se utiliza el TextInput para una cadena de búsqueda (véase Búsqueda o las nuevas funciones StartsWith).
Con DelayOutput establecido en true, hay un breve retraso antes de que se detecten los cambios. Esto le da tiempo para terminar de escribir. El retardo funciona bien con la propiedad TextInput.OnChange. Si tiene acciones vinculadas a cambios, no querrá que se desencadenen hasta que haya terminado de escribir en el campo.
Delegación y procesamiento del lado del servidor
Delegación
La delegación en Power Apps es un concepto que se refiere a la capacidad de la aplicación para trasladar ciertas operaciones al origen de datos subyacente en lugar de procesar las operaciones dentro de Power Apps misma. Al utilizar la delegación en Power Apps, los desarrolladores pueden crear aplicaciones más eficientes y escalables que funcionan bien incluso en escenarios que involucran grandes conjuntos de datos. Es importante ser consciente de las limitaciones de delegación para fuentes de datos y operaciones específicas y diseñar aplicaciones en consecuencia para lograr un rendimiento óptimo.
![NOTA] No todas las funciones son delegables. Consulte Entendiendo la Delegación para obtener más información sobre la delegación.
La delegación tiene varias ventajas, como la optimización de consultas, y agrega soporte para grandes conjuntos de datos. Además, si los datos de origen cambian con frecuencia, la delegación ayuda a mantener los datos actualizados.
Reducir las llamadas API al origen de datos
A veces, puede parecer conveniente crear colecciones realizando uniones dentro de su aplicación de lienzo. Mostramos ahora un ejemplo:
En este ejemplo, hay dos tablas: Conductores y Camiones. El código crea una colección de conductores y detalles del camión, y para cada camión, llama al conductor propietario del camión.
// 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)));
Realizar esta combinación en la aplicación de lienzo puede generar muchas llamadas al origen de datos, lo que conduce a tiempos de carga lentos.
Un mejor enfoque es:
// 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 el escenario en tiempo real, puede reducir los tiempos de carga de cinco minutos a menos de 10 segundos fijando los datos en el origen.
Procesamiento del lado del servidor
Diferentes orígenes de datos, como SQL y Dataverse, le permiten delegar el procesamiento de datos, como filtros y búsquedas, en el origen de datos. En SQL Server, puede crear vistas definidas por una consulta. En Dataverse, puede crear complementos de poco código para procesar datos en el servidor y devolver solo los resultados finales a su aplicación de lienzo.
Delegar el procesamiento de datos al servidor puede mejorar el rendimiento, reducir el código del lado cliente y hacer que la aplicación sea más fácil de mantener.
Más información acerca de complementos en Dataverse.
Optimizar patrones de datos de consulta
Usar la selección de columnas explícitas
La característica de selección de columna explícita (ECS) está activada de forma predeterminada para todas las aplicaciones nuevas. Si no está activada en la aplicación, actívala. ECS reduce automáticamente el número de columnas recuperadas a solo las que se usan en la aplicación. Si ECS no está activado, es posible que obtenga más datos de los que necesita, lo que puede afectar al rendimiento. A veces, cuando una aplicación obtiene datos a través de colecciones, se puede perder el origen original de una columna. ECS elimina columnas si no puede determinar si se usan. Para forzar a ECS a mantener una columna que falta, use la expresión ShowColumns
PowerFx después de una referencia de colección o en un control.
Evitar llamar a Power Automate para rellenar una colección
Una práctica común es utilizar Power Automate para buscar y rellenar colecciones en Power Apps. Si bien este enfoque es válido, hay situaciones en las que podría no ser la opción más eficiente. Llamar a Power Automate provoca una sobrecarga de latencia de red y agrega un coste de rendimiento de 0,6 segundos para instanciar el flujo de Power Automate.
El uso excesivo de flujos de Power Automate también puede provocar limitaciones de ejecución y limitación. Por lo tanto, evalúe siempre las compensaciones entre la latencia de la red y el coste de rendimiento.
Eliminar el problema N+1
El problema N+1 es un problema común en las consultas de bases de datos donde, en lugar de recuperar todos los datos requeridos en una sola consulta, se realizan varias consultas adicionales para recuperar datos relacionados. Esto puede provocar problemas de rendimiento, ya que cada consulta adicional genera una sobrecarga.
Una simple llamada como esta para cargar una colección puede generar N+1 llamadas a la fuente de datos.
ClearCollect(MyCollection, OrdersList,
{
LookUp(CustomersList,CustomerID = OrdersList[@CustomerID])
}
)
En el contexto de galerías y aplicaciones de lienzo, el problema N+1 puede surgir al trabajar con fuentes de datos y galerías que muestran registros relacionados. El problema suele ocurrir cuando se realizan más consultas para cada elemento que se muestra en la galería, lo que genera un cuello de botella en el rendimiento.
Utilice objetos de vista en SQL Server para evitar problemas de consulta N+1 o cambie la interfaz de usuario para evitar desencadenar el escenario N+1.
Dataverse recupera automáticamente los datos requeridos de las tablas relacionadas y puede seleccionar las columnas de las tablas relacionadas.
ThisItem.Account.'Account Name'
Si el tamaño de RelatedDataSourc
e` es pequeño (<500 registros), puede almacenarlo en caché en una colección y usar la colección para impulsar el escenario de consulta de búsqueda (N+1).
Limitar el tamaño del paquete
Aunque Power Apps hace mucho para optimizar la carga de aplicaciones, puede tomar medidas para reducir el espacio que ocupan las aplicaciones. Una huella reducida es especialmente importante para usuarios de dispositivos más antiguos o usuarios en lugares donde hay mayor latencia o ancho de banda reducido.
Evalúe los medios que están integrados en su aplicación. Si algo no se utiliza, elimínelo.
Las imágenes incrustadas pueden ser demasiado grandes. En lugar de archivos PNG, vea si puede usar imágenes SVG. Sin embargo, tenga cuidado al usar texto en imágenes SVG, porque la fuente que se use deberá instalarse en el cliente. Una excelente solución cuando necesitas mostrar texto es superponer una etiqueta de texto sobre una imagen.
Evalúe si la resolución es apropiada para el factor de forma. No es necesario que la resolución de una aplicación móvil sea tan alta como la resolución de una aplicación de escritorio. Experimente para conseguir el equilibrio adecuado entre calidad y tamaño de imagen.
Si tiene pantallas sin usar, elimínelas. Tenga cuidado de no eliminar ninguna pantalla oculta que solo utilicen los creadores o administradores de aplicaciones.
Evalúe si está intentando incluir demasiados flujos de trabajo en una sola aplicación. Por ejemplo, ¿tiene pantallas de administrador y pantallas de cliente en la misma aplicación? Si es así, considere dividirlas en aplicaciones individuales. Este enfoque también facilitará que varias personas trabajen en las aplicaciones al mismo tiempo y limita el "ámbito de impacto" (cantidad de prueba) cuando los cambios en la aplicación requieren un pase de prueba completo.
Optimizar ForAll
La función ForAll
en Power Apps se utiliza para recorrer una tabla de registros y aplicar una fórmula o un conjunto de fórmulas a cada registro. Si bien la función en sí es versátil, el uso inadecuado de la función ForAll puede hacer que su aplicación disminuya rápidamente su eficiencia de rendimiento.
La función ForAll es una función secuencial singular en lugar de una función concurrente. Por lo tanto, analiza solo un registro a la vez, obtiene el resultado y luego continúa con el siguiente hasta haber revisado todos los registros de su alcance.
Evitar la anidación de ForAll a toda costa. Esto puede generar iteraciones exponenciales y afectar significativamente el rendimiento.
ClearCollect(FollowUpMeetingAttendees.ForAll(ForAll(Distinct(AttendeesList.EmailAddress.Address).Lookup(Attendees))))
Actualizaciones en lotes a la base de datos
ForAll + Patch puede ser un método para actualizar la base de datos por lotes. Sin embargo, tenga cuidado con el orden de uso de For All y Patch.
La función siguiente:
Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
{
demoName:"fromCanvas2"
})
);
Funciona mejor que:
ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
{
demoName:"test"
})
);