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 Canvas evolucionan para satisfacer diferentes necesidades empresariales, es fundamental mantener un rendimiento excelente. 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.
A medida que las aplicaciones de lienzo se vuelven más complejas, puede enfrentarse a problemas de recuperación de datos, complejidad de las fórmulas y velocidad de representación. Para equilibrar la funcionalidad sólida con una interfaz de usuario con capacidad de respuesta, use un enfoque sistemático para la optimización del código.
Optimización de fórmulas de Power Fx
En esta sección se proporcionan procedimientos recomendados para optimizar las fórmulas de Power Fx.
Función With
La función 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 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 . es mejor que el contexto o las variables globales porque es independiente, fácil de entender y funciona en cualquier contexto de fórmula declarativa. Obtenga más información sobre la función With.
Captura de pantalla de una fórmula de Power Fx que usa la función With.
Función Concurrente
La función permite que varias fórmulas de la misma propiedad sean evaluadas simultáneamente si tienen llamadas de conector o Dataverse. Normalmente, se evalúan varias fórmulas al mismo tiempo cuando se encadenan con el operador (punto y coma). Con , 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 tiempo para 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. Obtenga más información sobre 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 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. es una buena manera de convertir cadenas vacías en valores en blanco. Obtenga más información sobre la función Coalesce.
En este ejemplo, se requiere evaluar dos veces y .
If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)
Esta función se puede reducir a:
Coalesce(value1, value2)
Función IsMatch
La función comprueba si una cadena de texto coincide con un patrón que puede incluir caracteres normales, patrones predefinidos o una expresión regular. Obtenga más información sobre la función IsMatch.
Por ejemplo, esta fórmula coincide con un número de Seguro Social de Estados Unidos.
IsMatch(TextInput1.Text, "\d{3}-\d{2}-\d{4}")
Explicación de la expresión regular:
Coincide con cualquier dígito (0-9).
Especifica que el patrón de dígitos anterior (\d) debe aparecer exactamente tres veces.
Coincide con el carácter guion.
Especifica que el patrón de dígitos anterior (\d) debe aparecer exactamente dos veces.
Especifica que el patrón de dígitos anterior (\d) debe aparecer exactamente cuatro veces.
Más ejemplos de :
IsMatch(TextInput1.Text, "Hello World")
IsMatch(TextInput1\_2.Text, "(?!^\[0-9\]\\\*$)(?!^\[a-zA-Z\]\\\*$)(\[a-zA-Z0-9\]{8,10})")
Optimizar la función OnStart de la aplicación
La propiedad para aplicaciones canvas desempeña un papel fundamental al definir acciones al iniciar 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. Comprenda y use eficazmente la propiedad para crear aplicaciones de lienzo eficaces y con capacidad de respuesta.
Optimice la función mediante la migración de definiciones de variables a fórmulas nombradas. Las fórmulas con nombre, especialmente las configuradas al principio del ciclo de vida de la aplicación, son 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. Obtenga más información en Crear aplicaciones grandes y complejas de lienzo.
Nota
La propiedad es imperativa. Es una lista ordenada de trabajo que debe realizarse antes de que aparezca la primera pantalla. Dado que es tan específico sobre no solo lo que se debe hacer, sino también cuando se debe realizar ese trabajo en función del orden, limita el reordenamiento y aplazamiento de optimizaciones que podrían realizarse de otro modo.
Iniciar pantalla
Si contiene una llamada a la función , incluso si está en la función y rara vez se llama, la aplicación debe completar la ejecución de antes de que muestre la primera pantalla de la aplicación. es una manera declarativa de indicar qué pantalla se debe mostrar primero y no bloquea las optimizaciones.
Al configurar la propiedad se muestra la primera pantalla antes de que se complete . declara qué objeto de pantalla se va a mostrar primero sin necesidad de preprocesamiento.
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)
Más información: App.StartScreen: una alternativa declarativa a Navegar en App.OnStart.
Advertencia
Evite dependencias entre y . Hacer referencia a una fórmula nombrada que, a su vez, hace referencia a una variable global, podría causar una condición de carrera en la cual no se aplique correctamente.
No cree dependencias entre y . Aunque la aplicación bloquea la referencia a variables globales en , puede hacer referencia a una fórmula con nombre, que a su vez hace referencia a una variable global. Este enfoque puede provocar una condición de carrera en la que no se aplica correctamente.
Fórmulas con nombre
Las fórmulas con nombre son constantes o estáticas que se pueden definir en . Una vez declarados en , se pueden usar en cualquier parte de la aplicación y sus valores siempre permanecen actualizados. Las fórmulas con nombre de Power Apps permiten definir valores o conjuntos de valores que la plataforma administra y actualiza automáticamente. Esta funcionalidad cambia la responsabilidad del cálculo de valor y el mantenimiento del desarrollador a Power Apps, lo que simplifica el proceso de desarrollo. Las fórmulas con nombre de Power Apps son una característica eficaz que puede mejorar significativamente el rendimiento y el mantenimiento de las aplicaciones.
Las fórmulas con nombre también ayudan al declarar temas de la aplicación. Cuando las empresas desarrollan aplicaciones empresariales, a menudo se desea que la aplicación tenga temas comunes que proporcionen una apariencia coherente y una experiencia de usuario consistente. Para crear un tema, debe declarar decenas a cientos de variables en . Esta declaración aumenta la longitud del código y el tiempo de inicialización de la aplicación.
Los controles modernos también pueden ayudar significativamente con el tematizado y ayudar a reducir la lógica escrita por el cliente para manejar el tematizado. Los controles modernos se encuentran actualmente en versión preliminar.
Por ejemplo, puede mover el código siguiente a , lo que reduce el tiempo de inicio en 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");
Puede mover el código a como se indica a continuación:
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 establecer . Aquí se requiere un cambio en una fórmula Lookup para obtener la información del usuario de Office 365 en lugar de Dataverse. Solo tiene que realizar el cambio en un solo lugar, 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 , , y 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 cambiar de la tabla Usuarios de Dataverse al conector de Office 365 sin necesidad de alterar las fórmulas dispersas en la aplicación.
Otro enfoque es optimizar .
varListItems = CountRows(SampleList)
Con la función , debe inicializar la variable con el recuento inicial de filas de la lista de ejemplo y volver a establecerla después de agregar o quitar los elementos de lista. Con fórmulas con nombre, a medida que cambian los datos, la variable se actualiza automáticamente.
Las fórmulas con nombre de la propiedad proporcionan un enfoque más flexible y declarativo para administrar valores y cálculos en toda la aplicación. Ofrecen ventajas en términos de independencia de tiempo, actualizaciones automáticas, mantenimiento e definiciones inmutables en comparación con confiar únicamente en .
| Aspecto | Fórmulas con nombre (App.Formulas) | App.OnStart |
|---|---|---|
| Independencia de tiempo | Las fórmulas están disponibles al instante y se pueden calcular en cualquier orden. | Las variables pueden introducir dependencias de tiempo que afectan a la disponibilidad. |
| Actualizaciones automáticas | Las fórmulas se actualizan automáticamente cuando cambian las dependencias. | Las variables se establecen una vez durante el inicio; Es posible que se necesiten actualizaciones manuales. |
| Mantenimiento | Las fórmulas centralizadas en una ubicación mejoran la mantenibilidad. | Es posible que las variables dispersas requieran buscar y actualizar en varios lugares. |
| Definiciones inmutables | Las definiciones de fórmulas de son inmutables. | Los valores de variable pueden ser susceptibles a cambios accidentales. |
Funciones definidas por el usuario
Funciones definidas por el usuario en Power Apps Studio le permiten crear sus propias funciones personalizadas.
Defina una fórmula en de la siguiente manera:
FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula
El código funciona de la siguiente manera:
invoca la función .
es el nombre de la entrada. Puede incluir una o varias entradas.
es el tipo de datos que el argumento pasado a la función debe coincidir. Los tipos de datos disponibles incluyen Boolean, Color, Date, Datetime, Dynamic, GUID, Hyperlink, Text y Time.
es el tipo de datos para la salida de la función.
es la salida de la función.
Use para implementar el control de errores dentro de la función definida:
// Function to calculate the area of a circle based on the radius
calcAreaOfCircle(radius: Number): Number =
IfError(Pi() * radius * radius, 0);
Llame a la función definida desde un control de texto o etiqueta.
calcAreaOfCircle(Int(*TextInput1*.Text))
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 de para cada propiedad.
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. Mantenga la aplicación power limpia y organizada para mejorar el rendimiento y facilitar el desarrollo.
Optimizar colecciones
Las colecciones son estructuras de almacenamiento de datos temporales que se usan para almacenar y manipular datos en una aplicación de Power Apps. Sin embargo, las colecciones pueden provocar una sobrecarga de rendimiento. 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 en lugar de .
Tenga en cuenta este enfoque al trabajar 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 para obtener solo columnas específicas. Agregue la función para obtener solo los datos relevantes.
La siguiente función de ejemplo devuelve todo el conjunto de datos:
ClearCollect(colDemoAccount, Accounts);Compare esta función con el código siguiente, que solo devuelve 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:
Captura de pantalla de un conjunto de datos con una tabla denominada colAcc y dos columnas, address1_city y nombre.
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. Dado que las colecciones coinciden con la estructura tabular del origen de datos y los Power Apps, permiten interactuar con los datos de forma eficaz, incluso cuando está sin conexión.
// 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
Aunque es posible que los elementos multimedia y las variables no utilizadas no afecten significativamente al rendimiento de la aplicación, es importante limpiar la aplicación quitando los medios o variables no utilizadas.
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
Para optimizar las pantallas y los controles en Power Apps, tenga en cuenta los siguientes procedimientos recomendados.
Evitar controles cruzados
Los controles que hacen referencia a controles en otras pantallas pueden ralentizar la carga y navegación de la aplicación. Este enfoque puede forzar que la aplicación cargue las otras pantallas 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.
El comprobador de aplicaciones de Power Apps Studio muestra los controles a los que se hace referencia cruzada. Revise el Comprobador de aplicaciones con regularidad para solucionar este problema.
En la imagen siguiente, se hace referencia cruzada al control Gallery 1 en el control Screen 2, Label 2.
Si haces referencia a un control de la primera pantalla de la aplicación en la segunda pantalla, no hay impacto en el rendimiento porque la primera pantalla ya está cargada. Este comportamiento es realmente beneficioso porque la aplicación es declarativa en lugar de usar variables.
Si hace referencia a controles que aún no están cargados, como la primera pantalla que hace referencia a un control denominado desde la pantalla 3, la aplicación carga esa pantalla en la memoria.
Habilitar DelayOutput para controles de texto
La configuración DelayOutput , cuando se establece en true, registra la entrada del usuario después de un retraso de medio segundo. Este retraso es útil para posponer operaciones costosas hasta que el usuario termine de escribir texto, como el filtrado cuando se usa la entrada en otras fórmulas.
Por ejemplo, considere una galería cuyos elementos se filtran en función de lo que escriba el usuario en el control TextInput:
Si establece DelayOutput en false, que es el valor predeterminado, la galería se filtra en cuanto se escribe cualquier texto. Si tiene una galería con muchos elementos, volver a cargar la galería con cambios de inmediato ralentiza el rendimiento. Es mejor esperar. Este comportamiento es práctico cuando se usa para una cadena de búsqueda o la función .
Si estableces DelayOutput en true, hay un breve retraso antes de que se detecten los cambios. Este retraso proporciona tiempo para terminar de escribir. El retraso funciona bien con la propiedad . Si tiene acciones asociadas con los cambios, no quiere que se desencadenen hasta que termine de escribir en el campo de texto.
Delegación y procesamiento del lado servidor
El uso de la delegación y el procesamiento del lado servidor permite que la aplicación maneje grandes conjuntos de datos de manera eficaz delegando operaciones en el origen de datos.
Delegación
La delegación en Power Apps hace referencia a la capacidad de la aplicación de descargar determinadas operaciones al origen de datos subyacente en lugar de procesar las operaciones dentro de Power Apps en sí misma. Al usar la delegación en Power Apps, puede crear aplicaciones más eficaces y escalables que funcionen bien incluso en escenarios que implican grandes conjuntos de datos. Tenga en cuenta las limitaciones de delegación de orígenes de datos y operaciones específicos, y diseñe la aplicación en consecuencia para lograr un rendimiento óptimo.
Nota
No todas las funciones son delegables. Obtenga más información sobre la delegación en Limitaciones de consulta: Límites de delegación y consulta.
La delegación tiene varias ventajas, como la optimización de consultas y el 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 Canvas. Considere el ejemplo siguiente. En el ejemplo, hay dos tablas: Conductores y Camiones. El código crea una colección de conductores y detalles de los camiones, 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 lleva a una carga más lenta.
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 mediante la corrección de los datos en el origen.
Procesamiento en el 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
Optimización del modo en que la aplicación consulta datos puede reducir significativamente los tiempos de carga y mejorar la capacidad de respuesta general.
Utilice la selección explícita de columnas
La característica de selección de columna explícita (ECS) está activada de forma predeterminada para todas las aplicaciones nuevas. Si no está activado para la aplicación, actítelo. 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 quita las columnas si no puede determinar que están siendo utilizadas. Para obligar a ECS a conservar una columna ausente, use la expresión Power Fx 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 habitual es usar Power Automate para capturar 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 agrega latencia de red y un costo de rendimiento de 0,6 segundos para instanciar el flujo de Power Automate.
El uso excesivo de flujos de Power Automate también puede dar lugar a límites de ejecución y limitaciones. Evalúe siempre las ventajas entre la latencia de red y el costo 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. Este problema puede provocar problemas de rendimiento, ya que cada consulta adicional incurre en sobrecarga.
Una llamada sencilla como esta para cargar una colección puede generar llamadas N+1 al origen de datos:
ClearCollect(MyCollection, OrdersList,
{
LookUp(CustomersList,CustomerID = OrdersList[@CustomerID])
}
)
En el contexto de las aplicaciones de lienzo y las galerías, puede surgir el problema N+1 al trabajar con orígenes 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.
Utilizar vistas en SQL Server para evitar el problema de la consulta N+1 o bien cambiar la interfaz de usuario para evitar desencadenar el escenario de 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 es pequeño (menos de 500 registros), almacénala en caché en una colección y usa la colección para realizar el escenario de consulta Lookup (N+1).
Limitar el tamaño del paquete
Aunque Power Apps optimiza la carga de aplicaciones, puede tomar medidas para reducir la huella de sus aplicaciones. Una superficie reducida es especialmente importante para los usuarios de dispositivos o usuarios más antiguos en configuraciones regionales en las que hay una mayor latencia o un ancho de banda reducido.
Evalúe los medios incrustados en la aplicación. Si algo no se utiliza, elimínelo.
Por ejemplo, las imágenes incrustadas pueden ser demasiado grandes. En lugar de archivos PNG, vea si puede usar imágenes SVG. Tenga cuidado de usar texto en imágenes SVG porque la fuente debe instalarse en el cliente. Una solución alternativa cuando necesita 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 facilita que varias personas trabajen en las aplicaciones al mismo tiempo y limita el "radio de explosión" (cantidad de pruebas) cuando los cambios de la aplicación requieren un pase de prueba completo.
Optimizar ForAll
La función ForAll en Power Apps se usa para iterar a través de una tabla de registros y aplicar fórmulas a cada registro. Aunque la propia función es versátil, el uso incorrecto de la función puede hacer que la app tenga un rendimiento menor.
La función es una función secuencial singular en lugar de una función simultánea. Por lo tanto, solo examina un registro a la vez, obtiene el resultado y, a continuación, continúa hasta el siguiente registro hasta que pasa por todos los registros en su ámbito.
Evite anidar . Esta práctica puede provocar iteraciones exponenciales y afectar significativamente al rendimiento.
ClearCollect(FollowUpMeetingAttendees.ForAll(ForAll(Distinct(AttendeesList.EmailAddress.Address).Lookup(Attendees))))
Actualización por lotes de la base de datos
Puede usar y para actualizar por lotes la base de datos. Sin embargo, tenga cuidado al usar el orden de y .
La siguiente función es el mejor enfoque, por ejemplo:
Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
{
demoName:"fromCanvas2"
})
);
Mientras que el siguiente enfoque es menos eficaz:
ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
{
demoName:"test"
})
);
Siguiente paso
Control de errores