Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
À medida que as aplicações de tela evoluem para satisfazer diferentes necessidades de negócio, mantenha o desempenho ótimo é crítico. O processamento de dados, o design da interface de utilizador e a funcionalidade da aplicação exigem uma abordagem cuidadosa à otimização de código.
Quando as aplicações de tela ficam mais complexas, pode ter problemas com a obtenção de dados, a complexidade de fórmulas e a velocidade de composição. Equilibrar uma funcionalidade forte e uma interface de utilizador reativa significa que precisa de uma abordagem sistemática para otimização de código.
Power Fx otimização de fórmulas
Funções With
A função With avalia uma fórmula para um único registo. A fórmula pode calcular um valor ou realizar ações, como modificar os dados ou trabalhar com uma ligação. Utilize With para facilitar a leitura de fórmulas complexas adividindo-as em subfórmulas com nomes mais pequenos. Estes valores nomeados funcionam como variáveis locais simples limitadas ao âmbito do With. A utilização de With é melhor do que variáveis globais ou de contexto, porque é independente, fácil de compreender e funciona em qualquer contexto de fórmula declarativa.
Mais informações sobre a função With.
Função Concurrent
A função Concurrent permite que várias fórmulas na mesma propriedade sejam avaliadas ao mesmo tempo se tiverem conector ou chamadas do Dataverse. Normalmente, são avaliadas várias fórmulas ao mesmo tempo quando as encadeia com o operador ; (ponto e vírgula). Com Concurrent, a aplicação avalia todas as fórmulas numa propriedade ao mesmo tempo, mesmo depois de usar o operador ;. Esta simultaneidade significa que os utilizadores esperam menos tempo por resultados. Quando as chamadas de dados não são iniciadas até as chamadas anteriores serem concluídas, a aplicação aguarda pela soma de todos os tempos de pedidos. Se as chamadas de dados forem iniciadas ao mesmo tempo, a aplicação só espera pelo tempo do pedido mais longo.
Mais informações sobre a função Concurrent.
Concurrent(
ClearCollect(colAccounts1, Accounts),
ClearCollect(colUsers1, Users),
ClearCollect(colEnvDef1, 'Environment Variable Definitions'),
ClearCollect(colEnvVal1, 'Environment Variable Values')
);
Função Coalesce
A função Coalesce avalia os argumentos por ordem e devolve o primeiro valor que não esteja em branco ou uma cadeia vazia. Utilize esta função para substituir um valor em branco ou uma cadeia vazia por um valor diferente, mas deixe os valores de cadeia não em branco e não vazios inalterados. Se todos os argumentos estão em branco ou cadeias vazias, a função devolve blank.
Coalesce é uma boa forma de converter cadeias vazias para valores em branco.
Por exemplo:
If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)
Requer que o valor 1 e o valor 2 sejam avaliados duas vezes. Esta função pode ser reduzida a:
Coalesce(value1, value2)
Função IsMatch
A função IsMatch testa se uma cadeia de texto corresponde a um padrão composto por carateres comuns, padrões predefinidos ou uma expressão regular.
Mais informações sobre a função IsMatch.
Por exemplo, esta fórmula corresponde a um Número de Segurança Social dos Estados Unidos:
IsMatch(TextInput1.Text, "\d{3}-\d{2}-\d{4}")
Explicação da expressão regular:
\\d Corresponde a qualquer dígito (0-9).
{3} Especifica que o padrão de dígitos anterior (\d) deve ocorrer exatamente três vezes.
- Corresponde ao caráter de hífen.
{2} Especifica que o padrão de dígitos anterior (\d) deve ocorrer exatamente duas vezes.
{4} Especifica que o padrão de dígitos anterior (\d) deve ocorrer exatamente quatro vezes.
Mais exemplos de IsMatch:
IsMatch(TextInput1.Text, "Hello World")
IsMatch(TextInput1\_2.Text, "(?!^\[0-9\]\\\*$)(?!^\[a-zA-Z\]\\\*$)(\[a-zA-Z0-9\]{8,10})")
Otimizar OnStart da aplicação
A propriedade OnStart para aplicações de tela desempenha um papel crucial na definição de ações que ocorrem quando a aplicação é iniciada. Esta propriedade permite que os programadores de aplicações executem tarefas de inicialização global, configurem variáveis e executem ações que só devem acontecer uma vez durante o processo de arranque da aplicação. Compreender e utilizar eficazmente a propriedade OnStart é essencial para criar aplicações de tela reativas e eficientes.
Uma abordagem recomendada é simplificar a App.OnStart função migrando configurações variáveis para fórmulas nomeadas. As fórmulas nomeadas, especialmente as configuradas no início do ciclo de vida da aplicação, revelam-se vantajosas. Estas fórmulas lidam com a inicialização de variáveis com base em chamadas de dados, fornecendo uma estrutura mais limpa e organizada para o seu código. Mais detalhes Criar aplicações de tela grandes e complexas — Power Apps | Microsoft Learn.
Nota
A propriedade OnStart é Imperativa. É uma lista ordenada de trabalho que precisa de ser feito antes que o primeiro ecrã seja mostrado. Por ser tão específico não apenas sobre o que precisa de ser feito, mas também quando esse trabalho tem de ser feito com base na ordem, limita a reordenação e o adiamento de otimizações que poderiam ser feitas de outra forma.
Ecrã inicial
Se App.OnStart contiver uma chamada de função Navigate, mesmo que esteja numa função If e raramente chamada, temos de concluir a execução da Aplicação.
OnStart antes de mostrarmos o primeiro ecrã da aplicação.
App.StartScreen é a nova forma declarativa de indicar que ecrã deve ser mostrado primeiro, que não bloqueie otimizações.
A definição da propriedade StartScreen mostra o primeiro ecrã antes de App.OnStart ser concluído.
App.StartScreen declares qual o objeto do ecrã a mostrar primeiro sem necessitar de qualquer pré-processamento.
Em vez de escrever código como:
App.OnStart = Collect(OrdersCache, Orders);
If(Param("AdminMode") = "1", Navigate(AdminScreen), Navigate(HomeScreen))
Alterar o código para:
App.OnStart = Collect(OrdersCache, Orders);
App.StartScreen = If(Param("AdminMode") = "1", AdminScreen, HomeScreen)
Consulte <https://Power Apps.microsoft.com/en-us/blog/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart/> para obter mais detalhes.
Aviso
Evite dependências entre StartScreen e OnStart. Referenciar uma fórmula nomeada que, por sua vez, referencia uma variável global pode causar uma condição race na qual StartScreen não é aplicada corretamente.
Nota: não devemos ter dependências entre StartScreen e OnStart. Bloqueamos a referência a variáveis globais em StartScreen, mas podemos consultar uma fórmula nomeada, que por sua vez referencia uma variável global e que pode causar uma condição race na qual StartScreen não é aplicada corretamente.
Fórmulas nomeadas
As fórmulas nomeadas são constantes ou estáticas que podem ser definidas na secção App.Formulas. Uma vez declarados em App.Formulas, podem ser utilizados em qualquer parte da aplicação e o seu valor permanece sempre atualizado. As Fórmulas nomeadas no Power Apps permitem a definição de valores ou conjuntos de valores que são automaticamente geridos e atualizados pela plataforma. Esta funcionalidade transfere a responsabilidade do cálculo de valor e manutenção do programador para Power Apps, simplificando o processo de desenvolvimento. As Fórmulas nomeadas no Power Apps são uma funcionalidade poderosa que pode melhorar significativamente o desempenho e a manutenção das aplicações.
As fórmulas nomeadas também abordar a declaração de temas de aplicações. Em muitos casos em que as aplicações empresariais são criadas, queremos que a aplicação tenha temas comuns para dar um aspeto e uma experiência de utilizador consistentes. Para criar um tema, existem dezenas e centenas de variáveis que precisam de ser declaradas em OnStart da Aplicação. Isso aumentou o comprimento do código e o tempo de inicialização do aplicativo.
Os controlos modernos também podem ajudar significativamente com a personalização e a reduzir a lógica escrita do cliente para processar personalizações. Os controlos modernos estão atualmente em pré-visualização.
Por exemplo, o código seguinte em App.OnStart pode ser movido para App.Formulas, reduzindo assim o tempo de arranque em declarações de variáveis globais.
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");
O código pode ser movido para App.Formulas da seguinte forma:
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";
Outro exemplo é em definir Lookups. Aqui, é necessária uma alteração numa fórmula de Procura para obter as informações de utilizador a partir do Office 365, em vez do Dataverse. Há apenas um lugar onde a alteração é necessária sem alterar o código em todos os lugares.
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 incorporam a essência do cálculo. Articulam o processo para determinar UserEmail, UserInfo, UserTitle e UserPhone com base noutros valores. Esta lógica é encapsulada, permitindo uma utilização generalizada em toda a aplicação, e pode ser modificada numa localização singular. A adaptabilidade estende-se à mudança da tabela Utilizadores do Dataverse para o conector do Office 365, sem necessitar de alterações às fórmulas espalhadas pela aplicação.
Outra abordagem é otimizar countRows.
varListItems = CountRows(SampleList)
Com a Função Set, a variável varListItems terá de ser inicializada com a contagem inicial de linhas na lista de amostras e definida novamente após os itens da lista terem sido adicionados ou removidos. Com fórmulas nomeadas, à medida que os dados mudam, as variáveis varListitems são atualizadas automaticamente.
As Fórmulas Nomeadas na propriedade App.Formulas fornecem uma abordagem mais flexível e declarativa para gerir valores e cálculos em toda a aplicação, o que oferece vantagens em termos de independência de temporização, atualizações automáticas, manutenção e definições imutáveis, em comparação com confiar apenas em App.OnStart.
| Aspecto | Fórmulas nomeadas (App.Formulas) | App.OnStart |
|---|---|---|
| Independência de tempo | As fórmulas ficam disponíveis instantaneamente e podem ser calculadas em qualquer ordem. | As variáveis podem introduzir dependências de tempo, afetando a disponibilidade. |
| Atualizações Automáticas | As fórmulas atualizam-se automaticamente quando as dependências mudam. | As variáveis são definidas uma vez durante a inicialização; poderão ser necessárias atualizações manuais. |
| Capacidade de Manutenção | Fórmulas centralizadas em um único local melhoram a capacidade de manutenção. | Variáveis dispersas podem exigir descoberta e atualização em vários locais. |
| Definições imutáveis | As definições de fórmula em App.Formulas são imutáveis. | Valores de variáveis podem ser suscetíveis a alterações acidentais. |
Funções definidas pelo utilizador
As Funções Definidas pelo Utilizador no Estúdio de Criação do Power Apps permitem que os utilizadores criem a sua própria função personalizada.
Para usar esta caraterística, nas definições de pré-visualização, ative Funções definidas pelo utilizador (UDFs). A funcionalidade de pré-visualização não deve ser usada em produção e é por isso que está desativada por predefinição, mas ficará geralmente disponível em breve.
Defina uma fórmula em App.Formulas da seguinte forma:
FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula
O código funciona assim:
FunctionNameé utilizado para invocar a funçãoParameteré o nome da entrada. É permitida uma ou mais entradasDataTypeé um argumento transmitido para a função que tem de corresponder a este tipo de dados. Os tipos de dados disponíveis incluem Booleano, Cor, Data, Datetime, Dinâmico, GUID, Hiperligação, Texto e HoraOutputDataTypeé o tipo de dados em que a saída da função estaráFormulaé a saída da função
// Function to calculate the area of a circle based on the radius
calcAreaOfCircle(radius: Number): Number =
IfError(Pi() * radius * radius, 0);
Utilize IfError para implementar o processamento de erros dentro da função definida.
Chame a função definida a partir do controlo de texto/etiqueta.
calcAreaOfCircle(Int(*TextInput1*.Text))
Nota
Esta é uma caraterística experimental e está sujeita a alterações. Alguns tipos de dados, como registos e filtros, ainda não são suportados.
Otimizar variáveis
As variáveis definem e estabelecem os valores local e global que usa em toda a aplicação. Embora sejam convenientes, a utilização de demasiadas variáveis pode tornar a sua aplicação menos eficiente.
O exemplo a seguir demonstra como definir uma variável para cada atributo de um objeto, o que requer a utilização de Set para cada propriedade.
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);
A abordagem mais eficiente é usar a propriedade apenas quando precisar dela:
Set(varEmployee, Office365Users.MyProfile())
"Welcome " & varEmployee.DisplayName
Utilize as variáveis de contexto e as variáveis globais de forma sensata. Se o âmbito de uma variável for além de um único ecrã, use variáveis globais em vez de variáveis de contexto.
Demasiadas variáveis não utilizadas aumentam a utilização da memória e podem abrandar a inicialização da aplicação. Os recursos são alocados para estas variáveis, mesmo que não as use. As variáveis não utilizadas também adicionam complexidade à lógica da sua aplicação. Embora o impacto possa não ser grave, é uma boa prática manter a sua Power App limpa e organizada para um melhor desempenho e um desenvolvimento mais fácil.
Otimizar coleções
As coleções são estruturas temporárias de armazenamento de dados que usa para armazenar e manipular dados numa aplicação do Power Apps. Mas as coleções podem causar sobrecarga no desempenho se as usar demais. Limite a utilização de coleções e use-as apenas quando necessário.
// Use this pattern
ClearCollect(colErrors, {Text: gblErrorText, Code: gblErrorCode});
// Do not use this pattern
Clear(colErrors);
Collect(colErrors, {Text: gblErrorText, Code: gblErrorCode});
Para contar registos numa coleção local, use CountIf em vez de Count(Filter()).
Considere esta orientação ao trabalhar com coleções:
Limite o tamanho e o número de coleções. Como as coleções são locais à aplicação, são armazenadas na memória do dispositivo móvel. Quanto mais dados as coleções armazenarem, ou quanto mais coleções usar, pior será o desempenho. Use a função ShowColumns para obter apenas colunas específicas. Adicione a função Filter para obter apenas os dados relevantes.
A função de exemplo a seguir retorna o conjunto de dados completo.
ClearCollect(colDemoAccount, Accounts);
Compare isto com o código a seguir, que devolve apenas registos e colunas específicos:
ClearCollect(colAcc,
ShowColumns(
Filter(Accounts, !IsBlank('Address 1: City')),
"name","address1_city"))
Este exemplo devolve o seguinte conjunto de dados:
Defina uma frequência de atualização da origem de dados. Se adicionar novos registos à coleção, atualize ou recolha-a para obter os registos novos ou alterados. Se vários utilizadores atualizarem a sua origem de dados, atualize a coleção para obter os registos novos ou alterados. Mais chamadas de atualização significam mais interação com o servidor.
Armazenar dados em cache em coleções e variáveis
A coleção é uma variável de tabela que armazena linhas e colunas de dados, não apenas um único item de dados. As coleções são úteis por dois motivos principais: agregar dados antes de enviá-los para a origem de dados e colocar em cache as informações para evitar consultas frequentes. Uma vez que as coleções correspondem à estrutura tabular da origem de dados e do Power Apps, permitem-lhe interagir com dados de forma eficiente, mesmo quando está offline.
// Clear the contents of EmployeeCollection, it already contains data
ClearCollect(
colEmployee,
{
Id: "1",
Name: "John",
Department: "IT"
},
{
Id: "2",
Name: "Nestor",
Department: "IT"
}
)
Remover variáveis e suportes de dados não utilizados
Embora multimédia e variáveis não utilizadas possam não ter um impacto significativo no desempenho da aplicação, é importante limpar a sua aplicação ao remover quaisquer multimédia ou variáveis não utilizadas.
Os ficheiros multimédia não utilizados aumentam o tamanho da aplicação, o que pode abrandar os tempos de carregamento da aplicação.
As variáveis não utilizadas aumentam a utilização da memória e podem abrandar ligeiramente a inicialização da aplicação. Os recursos são alocados para estas variáveis, mesmo que não sejam utilizadas. Demasiadas variáveis não utilizadas também podem tornar a lógica da aplicação mais complexa.
Utilize o Verificador de Aplicações para rever multimédia e variáveis não utilizadas.
Otimizar ecrãs e controlos
Evitar referências cruzadas entre controlos
Os controlos que referenciam controlos noutros ecrãs podem abrandar o carregamento e a navegação da aplicação. Isto pode forçar a aplicação a carregar os outros ecrãs imediatamente, em vez de esperar até que o utilizador aceda a esse ecrã. Para corrigir este problema, utilize variáveis, coleções e contexto de navegação para partilhar o estado nos ecrãs.
O Verificador de aplicações no Power Apps Studio mostra controlos com referência cruzada. Reveja o Verificador de Aplicações regularmente para corrigir este problema.
Segue-se um exemplo de controlos de referência cruzada. Na imagem abaixo, o controlo Galeria 1 tem referencia cruzada no Ecrã 2, controlo Etiqueta 2.
Se referenciar um controlo do primeiro ecrã na aplicação no segundo ecrã, o desempenho não serã afetado porque o primeiro ecrã já está carregado. Isto pode realmente ser uma coisa boa porque a aplicação é declarativa em vez de usar variáveis.
Se referenciar controlos que ainda não estão carregados, como o primeiro ecrã a referenciar um controlo nomeado Label 3 do ecrã 3, a aplicação carrega esse ecrã na memória.
Ativar DelayOutput para controlos de texto
A definição DelayOutput, quando definida como true, regista a entrada de utilizador após meio segundo de atraso. Isto é útil para adiar operações dispendiosas até que o utilizador conclua a introdução de texto, como a filtragem quando a introdução é utilizada noutras fórmulas.
Por exemplo, para uma Galeria cujos itens são Filtrados dependendo do que o utilizador introduz no controlo TextInput:
Com DelayOutput definido como false, que é a predefinição, a galeria é filtrada assim que qualquer texto é escrito. Se tiver uma galeria com muitos itens, recarregar a galeria com alterações imediatamente diminui o desempenho. É melhor esperar um pouco. Isto é prático quando estiver a utilizar TextInput para uma cadeia de pesquisa (consulte Pesquisar ou as novas funções StartsWith).
Com DelayOutput definido como true, há um curto atraso antes de as alterações serem detetadas. Isto dá-lhe tempo para terminar de escrever. O atraso funciona bem com a propriedade TextInput.OnChange. Se tiver ações vinculadas a alterações, não deseja que sejam acionadas até terminar de escrever no campo.
Delegação e processamento do lado do servidor
Delegação
A delegação no Power Apps é um conceito que se refere à capacidade da aplicação de descarregar certas operações para a origem de dados subjacente, em vez de processar as operações no Power Apps. Ao utilizar a delegação Power Apps, os programadores podem criar aplicações mais eficientes e dimensionáveis com um bom desempenho, mesmo em cenários que envolvam grandes conjuntos de dados. É importante estar ciente das limitações de delegação para operações e origens de dados específicas e conceber aplicações em conformidade para obter um desempenho ideal.
![NOTA] Nem todas as funções são delegáveis. Consulte Compreender a Delegação para obter mais informações sobre a delegação.
A delegação tem várias vantagens, como a otimização de consultas e adiciona suporte para grandes conjuntos de dados. Além disso, se os dados de origem mudarem frequentemente, a delegação ajuda a manter os dados atualizados.
Reduzir chamadas à API para a origem de dados
Por vezes, pode parecer conveniente criar coleções realizando uniões dentro da sua aplicação de tela. Eis um exemplo:
Neste exemplo, há duas tabelas: Motoristas e Camiões. O código cria uma coleção de motoristas e detalhes do camião e, para cada camião, chama o motorista que possui o camião.
// 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 essa união na aplicação de tela pode gerar muitas chamadas para a origem de dados, o que leva a tempos de carregamento lentos.
Uma abordagem melhor é:
// 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'
)
)
No cenário em tempo real, pode reduzir os tempos de carregamento de cinco minutos para menos de 10 segundos ao corrigir os dados na origem.
Processamento do lado do servidor
Diferentes origens de dados, como SQL e Dataverse, permitem delegar o processamento de dados, como filtros e procuras, para a origem de dados. No SQL Server, pode criar vistas definidas por uma consulta. No Dataverse, pode criar plug-ins low-code para processar dados no servidor e devolver apenas os resultados finais para a sua aplicação de tela.
Delegar o processamento de dados para o servidor pode melhorar o desempenho, reduzir o código do lado do cliente e tornar a sua aplicação mais fácil de manter.
Mais informações sobre plug-ins no Dataverse.
Otimizar padrões de dados de consulta
Utilizar seleção de colunas explícita
A caraterística de Seleção Explícita de Colunas (ECS) está ativada por predefinição para todas as novas aplicações. Se ainda não estiver ativada para a sua aplicação, ative-a. A ECS reduz automaticamente o número de colunas obtidas apenas para aquelas usadas na aplicação. Se a ECS não estiver ativada, pode obter mais dados do que precisa, o que pode afetar o desempenho. Por vezes, quando uma aplicação recebe dados através de coleções, a origem original de uma coluna pode ser perdida. A ECS descarta colunas se não puder dizer que são usadas. Para forçar a ECS a manter uma coluna em falta, use a expressão ShowColumns do PowerFx após uma referência de coleção ou num controlo.
Evitar chamar o Power Automate para preencher uma coleção
Uma prática comum é utilizar o Power Automate para obter e preencher coleções no Power Apps. Embora esta abordagem seja válida, existem situações em que poderá não ser a escolha mais eficiente. A chamada ao Power Automate vem com uma sobrecarga de latência de rede e adiciona um custo de desempenho de 0,6 segundos para instanciar o fluxo do Power Automate.
A utilização excessiva de fluxos do Power Automate também pode levar a limites de execução e a limitações. Portanto, sempre avalie as compensações entre a latência da rede e o custo de desempenho.
Eliminar o problema N+1
O problema N+1 é um problema comum em consultas de base de dados onde, em vez de obter todos os dados necessários numa única consulta, são feitas várias consultas adicionais para obter dados relacionados. Isto pode levar a problemas de desempenho, uma vez que cada consulta adicional incorre em sobrecarga.
Uma simples chamada como esta para carregar uma coleção, pode gerar chamadas N+1 para a origem de dados.
ClearCollect(MyCollection, OrdersList,
{
LookUp(CustomersList,CustomerID = OrdersList[@CustomerID])
}
)
No contexto de aplicações de tela e galerias, o problema N+1 pode surgir ao trabalhar com origens de dados e galerias que apresentam registos relacionados. O problema ocorre normalmente quando são feitas mais consultas para cada item apresentado na galeria, levando a um estrangulamento de desempenho.
Utilize Ver objetos no SQL Server para evitar problemas de consulta N+1 ou altere a interface de utilizador para evitar acionar o cenário N+1.
Dataverse obtém automaticamente os dados necessários de tabelas relacionadas e pode selecionar as colunas a partir de tabelas relacionadas.
ThisItem.Account.'Account Name'
Se o tamanho de RelatedDataSource for pequeno (<500 registos), pode colocá-lo em cache numa coleção e utilizar a coleção para fomentar o cenário de consulta de Procura (N+1).
Limitar o tamanho do pacote
Apesar de o Power Apps fazer muito para otimizar o carregamento de aplicações, pode tomar medidas para reduzir a pegada das suas aplicações. Uma pegada reduzida é especialmente importante para usuários de dispositivos mais antigos ou usuários em localidades onde há maior latência ou largura de banda reduzida.
Avalie os conteúdos multimédia incorporados na sua aplicação. Se algo não for utilizado, elimine-o.
As imagens incorporadas poderão ser demasiado grandes. Em vez de ficheiros PNG, veja se pode utilizar imagens SVG. No entanto, tenha cuidado ao usar texto em imagens SVG, porque a fonte usada terá que ser instalada no cliente. Uma solução ótima quando precisa de mostrar texto é sobrepor uma etiqueta de texto a uma imagem.
Avalie se a resolução é adequada para o fator de forma. A resolução para uma aplicação móvel não precisa de ser tão alta como a resolução para uma aplicação de ambiente de trabalho. Experimente para obter o equilíbrio certo entre qualidade e tamanho da imagem.
Se tiver ecrãs não utilizados, elimine-os. Tenha cuidado para não eliminar quaisquer ecrãs ocultos que só os criadores de aplicações ou administradores utilizam.
Avalie se está a tentar encaixar demasiados fluxos de trabalho numa única aplicação. Por exemplo, tem ecrãs de administração e de cliente na mesma aplicação? Em caso afirmativo, considere dividi-las em aplicações individuais. Esta abordagem também facilitará o trabalho de várias pessoas nas aplicações ao mesmo tempo e limita a "área de impacto" (quantidade de testes) quando as alterações à aplicação exigirem uma aprovação de teste completa.
Otimizar ForAll
A função ForAll em Power Apps é utilizada para iterar através de uma tabela de registos e aplicar uma fórmula ou conjunto de fórmulas a cada registo. Embora a função em si seja versátil, a utilização inadequada da função ForAll pode rapidamente afetar negativamente o desempenho da sua aplicação.
A função ForAll é uma função sequencial singular em vez de uma função concorrente. Por conseguinte, analisa apenas um registo de cada vez, obtém o resultado e, em seguida, continua para o seguinte até passar por todos os registos no respetivo âmbito.
Evite o Aninhamento de ForAll a todo custo. Isto pode levar a iterações exponenciais e afetar significativamente o desempenho.
ClearCollect(FollowUpMeetingAttendees.ForAll(ForAll(Distinct(AttendeesList.EmailAddress.Address).Lookup(Attendees))))
Atualizações em lote para o banco de dados
ForAll + Patch pode ser uma abordagem para atualizar o banco de dados em lote. No entanto, tenha cuidado com a utilização da ordem de ForAll e Patch.
A função seguinte:
Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
{
demoName:"fromCanvas2"
})
);
Tem um desempenho melhor do que:
ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
{
demoName:"test"
})
);