Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
À medida que os aplicativos de tela evoluem para atender a diferentes necessidades de negócios, manter o desempenho ideal é crítico. O tratamento de dados, o design da interface do usuário e a funcionalidade do aplicativo exigem uma abordagem cuidadosa para a otimização do código.
Quando os aplicativos de tela ficam mais complexos, você pode ter problemas com a recuperação de dados, a complexidade da fórmula e a velocidade de renderização. Equilibrar uma funcionalidade forte e uma interface de usuário responsiva significa que você precisa de uma abordagem sistemática para otimização de código.
Otimização de fórmulas do Power Fx
Função With
A função With avalia uma fórmula para um único registro. A fórmula pode calcular um valor ou executar ações, como modificar dados ou trabalhar com uma conexão. Use With para tornar fórmulas complexas mais fáceis de ler, dividindo-as em subfórmulas menores nomeadas. Esses valores nomeados atuam como variáveis locais simples limitadas ao escopo de With. Usar With é melhor que contexto ou variáveis globais porque é autocontido, fácil de entender e funciona em qualquer contexto de fórmula declarativa.
Saiba mais 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, várias fórmulas são avaliadas ao mesmo tempo quando você as encadeia com o operador ; (ponto e vírgula). Com a função Concurrent, o aplicativo avalia todas as fórmulas em uma propriedade ao mesmo tempo, mesmo depois de usar o operador ;. Essa simultaneidade significa que os usuários aguardam menos pelos resultados. Quando as chamadas de dados não forem iniciadas até que as chamadas anteriores sejam concluídas, o aplicativo aguarda a soma de todos os tempos da solicitação. Se as chamadas de dados forem iniciadas ao mesmo tempo, o aplicativo aguarda apenas pelo tempo de solicitação mais longo.
Saiba mais 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 seus argumentos na ordem e retorna o primeiro valor que não está em branco ou uma cadeia de caracteres vazia. Use esta função para substituir um valor em branco ou uma cadeia de caracteres vazia por um valor diferente, sem alterar os valores de cadeia de caracteres não em branco e não vazios. Se todos os argumentos forem strings em branco ou vazias, a função retornará em branco.
Coalesce é uma boa maneira de converter cadeias de caracteres vazias em 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. Essa função pode ser reduzida para:
Coalesce(value1, value2)
Função IsMatch
A função IsMatch testa se uma cadeia de texto corresponde a um padrão composto de caracteres comuns, padrões predefinidos ou uma expressão regular.
Saiba mais sobre a função IsMatch.
Por exemplo, esta fórmula corresponde a um número do Seguro 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 caractere 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 aplicativo OnStart
A propriedade OnStart para aplicativos cavas desempenha um papel crucial na definição de ações que ocorrem quando o aplicativo é iniciado. Essa propriedade permite que os desenvolvedores de aplicativos executem tarefas de inicialização globais, configurem variáveis e executem ações que devem acontecer apenas uma vez durante o processo de inicialização do aplicativo. Entender e utilizar efetivamente a propriedade OnStart é essencial para criar aplicativos de tela responsivos e eficientes.
Uma abordagem recomendada é simplificar a função App.OnStart migrando configurações de variáveis para fórmulas nomeadas. As fórmulas nomeadas, especialmente aquelas configuradas no início do ciclo de vida do aplicativo, mostram-se vantajosas. Essas fórmulas lidam com a inicialização de variáveis com base em chamadas de dados, fornecendo uma estrutura mais limpa e organizada para seu código. Mais detalhes Criar aplicativos de tela grandes e complexos - Power Apps | Microsoft Learn.
Observação
A propriedade OnStart é Imperativa. É uma lista ordenada de trabalho que precisa ser feito antes que a primeira tela seja mostrada. Por ser tão específico não apenas sobre o que precisa ser feito, mas também quando esse trabalho deve ser feito com base na ordem, ele limita o reordenamento e adiamento de otimizações que poderiam ser feitas de outra forma.
Tela inicial
Se App.OnStart contiver uma chamada de função Navigate, mesmo que esteja em uma função If e raramente chamada, devemos concluir a execução do Aplicativo
OnStart antes de apresentarmos a primeira tela do aplicativo.
App.StartScreen é a nova maneira declarativa de indicar qual tela deve ser mostrada primeiro, que não bloqueia otimizações.
A configuração da propriedade StartScreen mostra a primeira tela antes da conclusão de App.OnStart.
App.StartScreen declares qual objeto de tela deve ser mostrado primeiro sem exigir nenhum pré-processamento.
Então, em vez de escrever código como:
App.OnStart = Collect(OrdersCache, Orders);
If(Param("AdminMode") = "1", Navigate(AdminScreen), Navigate(HomeScreen))
Altere 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. Fazer referência a uma fórmula nomeada que, por sua vez, faz referência a uma variável global pode causar uma condição de concorrência na qual StartScreen não é aplicada corretamente.
Observação: não devemos ter dependências entre StartScreen e OnStart. Bloqueamos a referência a variáveis globais no StartScreen, mas podemos fazer referência a uma fórmula nomeada que, por sua vez, faz referência a uma variável global e que pode causar uma condição de corrida na qual o StartScreen não é aplicado corretamente.
Fórmulas nomeadas
As fórmulas nomeadas são estáticas ou constantes que podem ser definidas na seção App.Formulas. Depois de declaradas em App.Formulas, elas podem ser usados em qualquer lugar no aplicativo e seu valor sempre permanece atualizado. As Fórmulas Nomeadas no Power Apps ativam a definição de valores ou conjuntos de valores que são gerenciados e atualizados automaticamente pela plataforma. Essa funcionalidade transfere a responsabilidade do cálculo de valor e manutenção do desenvolvedor para o Power Apps, agilizando o processo de desenvolvimento. As Fórmulas Nomeadas no Power Apps são uma funcionalidade avançada que pode melhorar significativamente o desempenho e a capacidade de manutenção do aplicativo.
As fórmulas nomeadas também podem abordar a declaração de temas de aplicativo. Em muitos casos em que aplicativos empresariais são criados, queremos que o aplicativo tenha temas comuns para dar aparência e experiência do usuário consistentes. Para criar um tema, existem 10s e 100s de variáveis que precisam ser declaradas no aplicativo OnStart. Isso aumentou o comprimento do código e o tempo de inicialização do aplicativo.
Os controles modernos também podem ajudar significativamente com a criação de temas e ajudar a reduzir a lógica escrita pelo cliente para lidar com os temas. Controles modernos estão em versão preliminar.
Por exemplo, o código a seguir no App.OnStart pode ser movido para App.Formulas, reduzindo assim o tempo de inicialização 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 maneira:
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 é a configuração interna Lookups. Aqui, é necessária uma alteração em uma fórmula de pesquisa para obter as informações do usuário, em vez de Office 365 Dataverse. Há apenas um lugar em que 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');
Essas fórmulas incorporam a essência do cálculo. Elas articulam o processo para determinar UserEmail, UserInfo, UserTitle e UserPhone com base em outros valores. Essa lógica é encapsulada, permitindo ampla utilização em todo o aplicativo, e pode ser modificada em um único local. A adaptabilidade se estende à alternância da tabela Usuários do Dataverse para o conector do Office 365 sem necessidade de alterações em fórmulas espalhadas pelo aplicativo.
Outra abordagem é otimizar countRows.
varListItems = CountRows(SampleList)
Com a função Set, a variável varListItems terá que ser inicializada com a contagem inicial de linhas na lista de amostras e definida novamente depois que os itens da lista forem adicionados ou removidos. Com as 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 gerenciar valores e cálculos em todo o aplicativo, oferecendo vantagens em termos de independência de tempo, atualizações automáticas, capacidade de manutenção e definições imutáveis em comparação com a dependência exclusiva App.OnStart.
| Aspecto | Fórmulas nomeadas (App.Formulas) | App.OnStart |
|---|---|---|
| Independência de Tempo | As fórmulas estão disponíveis instantaneamente, podem ser calculadas em qualquer ordem. | As variáveis podem introduzir dependências de tempo, impactando a disponibilidade. |
| Atualizações Automáticas | As fórmulas são atualizadas automaticamente quando as dependências mudam. | As variáveis são definidas uma vez durante a inicialização; as atualizações manuais podem ser necessárias. |
| Capacidade de Manutenção | Fórmulas centralizadas em um único local melhoram a capacidade de manutenção. | Variáveis dispersas podem exigir localização e atualização em vários lugares. |
| Definições Imutáveis | As definições de fórmula em App.Formulas são imutáveis. | Os valores das variáveis podem ser suscetíveis a mudanças acidentais. |
Funções definidas pelo usuário
As Funções Definidas pelo Usuário no Power Apps - O Authoring Studio permite que os usuários criem sua própria função personalizada.
Para usar esse recurso, em configurações de versão preliminar, ative UDFs (Funções definidas pelo usuário). A funcionalidade de versão preliminar não deve ser usada na produção, e é por isso que ela está desabilitada por padrão, mas ficará disponível em breve.
Defina uma fórmula de App.Formulas da seguinte maneira:
FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula
O código funciona assim:
FunctionNameé usado para invocar a funçãoParameteré o nome da entrada. Um ou mais entradas são permitidasDataTypeé um argumento passado para a função e deve corresponder a este tipo de dados. Os tipos de dados disponíveis incluem Booliano, Cor, Data, Datetime, Dinâmico, GUID, Hiperlink, Texto e HoraOutputDataTypeé o tipo de dados no qual 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);
Use IfError para implementar o tratamento de erros dentro da função definida.
Chame a função definida a partir do controle de texto/rótulo.
calcAreaOfCircle(Int(*TextInput1*.Text))
Observação
Este é um recurso experimental e está sujeito a alterações. Alguns tipos de dados, como registros e filtros, ainda não são compatíveis.
Otimizar variáveis
As variáveis definem valores locais e globais que você usa em todo o aplicativo. Embora sejam convenientes, o uso de muitas variáveis pode tornar seu aplicativo menos eficiente.
O exemplo a seguir demonstra como definir uma variável para cada atributo de um objeto, que requer o uso 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);
Uma abordagem mais eficiente é usar a propriedade somente quando você precisar dela:
Set(varEmployee, Office365Users.MyProfile())
"Welcome " & varEmployee.DisplayName
Use variáveis de contexto e variáveis globais com sabedoria. Se o escopo de uma variável for além de uma única tela, use variáveis globais em vez de variáveis de contexto.
Muitas variáveis não utilizadas aumentam o uso de memória e podem retardar a inicialização do aplicativo. Os recursos são alocados para essas variáveis, mesmo que você não as use. As variáveis não utilizadas também adicionam complexidade à lógica do seu aplicativo. Embora o impacto possa não ser grave, é uma boa prática manter seu Power App limpo e organizado para um melhor desempenho e desenvolvimento mais fácil.
Otimizar coleções
As coleções são estruturas temporárias de armazenamento de dados que você usa para armazenar e manipular dados em um aplicativo do Power Apps. Mas as coleções podem causar sobrecarga de desempenho se você usá-las demais. Limite o uso 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 registros em uma 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 para o aplicativo, elas são armazenadas na memória do dispositivo móvel. Quanto mais coleções de dados forem mantidas, ou quanto mais coleções você usar, pior será o desempenho. Use a função ShowColumns para obter apenas colunas específicas. Adicione a função Filter para obter apenas dados relevantes.
A função de exemplo a seguir retorna o conjunto de dados inteiro.
ClearCollect(colDemoAccount, Accounts);
Compare isso com o código a seguir, que retorna apenas registros e colunas específicos:
ClearCollect(colAcc,
ShowColumns(
Filter(Accounts, !IsBlank('Address 1: City')),
"name","address1_city"))
Este exemplo retorna o seguinte conjunto de dados:
Definir uma frequência de atualização da fonte de dados. Se você adicionar novos registros à coleção, atualize-a ou colete-a para obter os registros novos ou alterados. Se vários usuários atualizarem sua fonte de dados, atualize a coleção para obter os registros 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
Uma 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 à fonte de dados e armazenar informações em cache para evitar consultas frequentes. Como as coleções correspondem à estrutura tabular da fonte de dados e do Power Apps, elas permitem que você interaja com os dados de forma eficiente, mesmo quando estiver 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 mídia não utilizadas
Embora a mídia e as variáveis não utilizadas possam não ter um impacto significativo no desempenho do aplicativo, é importante limpar o aplicativo removendo todas as mídias ou variáveis não utilizadas.
Os arquivos de mídia não utilizados aumentam o tamanho do aplicativo, o que pode diminuir o tempo de carregamento do aplicativo.
As variáveis não utilizadas aumentam o uso de memória e podem retardar um pouco a inicialização do aplicativo. Os recursos são alocados para essas variáveis, mesmo que não sejam usados. Muitas variáveis não utilizadas também podem tornar a lógica do aplicativo mais complexa.
Use o Verificador de Aplicativo para analisar mídias e variáveis não utilizadas.
Otimizar telas e controles
Evitar controles de referência cruzada
Os controles que fazem referência a controles em outras telas podem tornar o carregamento e a navegação do aplicativo mais lentos. Isso pode forçar o aplicativo a carregar as outras telas imediatamente, em vez de esperar até que o usuário vá para essa tela. Para corrigir este problema, use variáveis, coleções e contexto de navegação para compartilhar o estado nas telas.
O verificador de Aplicativo no Power Apps Studio mostra controles com referências cruzadas. Revise o verificador de aplicativos regularmente para corrigir esse problema.
Veja um exemplo de controles com referências cruzadas. Na imagem abaixo, o controle Gallery 1 é com referência cruzada na Tela 2, controle de Rótulo 2.
Se você fizer referência a um controle da primeira tela do aplicativo na segunda tela, não haverá um impacto no desempenho porque a primeira tela já está carregada. Isso pode realmente ser uma coisa boa porque o aplicativo é declarativo em vez de usar variáveis.
Se você fizer referência a controles que ainda não foram carregados, como a primeira tela fazendo referência a um controle nomeado Label 3 na tela 3, o aplicativo carregará essa tela na memória.
Habilitar DelayOutput para controles de texto
A configuração DelayOutput, quando definida como verdadeira, registra a entrada de usuário após um atraso de meio segundo. É útil para atrasar operações caras até que o usuário termine de inserir o texto, como filtrar quando a entrada é usada em outras fórmulas.
Por exemplo, para uma Galeria cujos itens são filtrados dependendo do que o usuário insere no controle TextInput:
Com DelayOutput definido como false, que é o padrão, a galeria é filtrada assim que qualquer texto é digitado. Se você tiver uma galeria com muitos itens, recarregar a galeria com alterações imediatamente diminuirá o desempenho. É melhor esperar um pouco. Isso é prático quando você está usando o TextInput para uma cadeia de caracteres de pesquisa (consulte Pesquisar ou as novas funções StartsWith).
Com DelayOutput definido como true, há um pequeno atraso antes que as alterações sejam detectadas. Isso lhe dá tempo para terminar de digitar. O atraso funciona bem com a propriedade TextInput.OnChange. Se você tiver ações vinculadas a alterações, não deseja que elas sejam acionadas até que você termine de digitar no campo.
Delegação e processamento do servidor
Delegação
A delegação no Power Apps é um conceito que se refere à capacidade do aplicativo de descarregar determinadas operações para a fonte de dados subjacente, em vez de processar as operações dentro do próprio Power Apps. Usando a delegação no Power Apps, os desenvolvedores podem criar aplicativos mais eficientes e escalonáveis com bom desempenho, mesmo em cenários que envolvem grandes conjuntos de dados. É importante estar ciente das limitações de delegação para fontes de dados e operações específicas e projetar os aplicativos adequadamente para atingir o desempenho ideal.
![OBSERVAÇÃO] Nem todas as funções são delegáveis. Consulte Noções básicas sobre Delegação para saber mais sobre delegação.
A delegação tem várias vantagens, como Otimização de consulta, e adiciona suporte para grandes conjuntos de dados. Além disso, se os dados de origem forem alterados com frequência, a delegação ajudará a manter os dados atualizados.
Reduza as chamadas de API para fonte de dados
Às vezes, pode parecer conveniente criar coleções realizando junções dentro do seu aplicativo de tela. Veja um exemplo:
Neste exemplo, existem duas tabelas: Motoristas e Caminhões. O código cria uma coleção de motoristas e detalhes do caminhão e, para cada caminhão, chama o motorista que possui o caminhã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)));
Executar essa junção no aplicativo de tela pode gerar muitas chamadas para a fonte 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, você pode reduzir os tempos de carregamento de cinco minutos para menos de 10 segundos corrigindo os dados na origem.
Processamento do servidor
Diferentes fontes de dados, como SQL e Dataverse, permitem delegar o processamento de dados, como filtros e pesquisas, à fonte de dados. No SQL Server, você pode criar exibições definidas por uma consulta. No Dataverse, você pode criar plug-ins low-code para processar dados no servidor e retornar apenas os resultados finais para o seu aplicativo de tela.
Delegar o processamento de dados ao servidor pode melhorar o desempenho, reduzir o código do lado do cliente e facilitar a manutenção do aplicativo.
Saiba mais sobre plug-ins no Dataverse.
Otimizar padrões de dados de consulta
Usar seleção de coluna explícita
O recurso ECS (Seleção Explícita de Coluna) está ativado por padrão para todos os novos aplicativos. Se ele não estiver ativado para seu aplicativo, ative-o. O ECS reduz automaticamente o número de colunas recuperadas apenas para aquelas usadas no aplicativo. Se o ECS não estiver ativado, você poderá obter mais dados do que o necessário, o que pode afetar o desempenho. Às vezes, quando um aplicativo obtém dados por meio de coleções, a fonte original de uma coluna pode ser perdida. O ECS descarta colunas se não puder determinar que estão sendo usadas. Para forçar o ECS a manter uma coluna ausente, use a expressão ShowColumns do PowerFx após uma referência de coleção ou em um controle.
Evitar chamar o Power Automate para preencher uma coleção
Uma prática comum é usar o Power Automate para buscar e preencher coleções no Power Apps. Embora essa abordagem seja válida, há situações em que ela pode não ser a escolha mais eficiente. A chamada do Power Automate vem com uma sobrecarga de latência de rede e adiciona um custo de desempenho de 0,6 segundo para instanciar o fluxo do Power Automate.
O uso excessivo de fluxos do Power Automate também pode conduzir a limites de execução e limitação. Portanto, sempre avalie os trade-offs entre latência de rede e custo de desempenho.
Elimine o problema N+1
O problema N+1 é um problema comum em consultas de banco de dados em que, em vez de buscar todos os dados necessários em uma única consulta, várias consultas extras são feitas para recuperar dados relacionados. Isso pode levar a problemas de desempenho, pois cada consulta extra gera sobrecarga.
Uma chamada simples como esta para carregar uma coleção pode gerar chamadas N+1 para fonte de dados.
ClearCollect(MyCollection, OrdersList,
{
LookUp(CustomersList,CustomerID = OrdersList[@CustomerID])
}
)
No contexto de aplicativos de tela e galerias, o problema N+1 pode surgir ao trabalhar com fontes de dados e galerias que exibem registros relacionados. O problema geralmente ocorre quando mais consultas são feitas para cada item exibido na galeria, levando a um gargalo de desempenho.
Use Exibir objetos no SQL Server para evitar o problema de consulta N+1 ou altere a interface do usuário para evitar o acionamento do cenário N+1.
O Dataverse busca automaticamente os dados necessários das tabelas relacionadas e você pode selecionar as colunas das tabelas relacionadas.
ThisItem.Account.'Account Name'
Se o tamanho de RelatedDataSourcfor pequeno (<500 registros), você poderá armazená-lo em cache em uma coleção e usar a coleção para conduzir o cenário de consulta Pesquisa (N+1).
Limitando o tamanho do pacote
Embora o Power Apps faça muito para otimizar o carregamento do aplicativo, você pode tomar medidas para reduzir o volume de seus aplicativos. Um volume ocupado reduzido é 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 as mídias incorporadas em seu aplicativo. Se algo não for usado, exclua-o.
As imagens incorporadas podem ser muito grandes. Em vez de arquivos PNG, veja se você pode usar imagens SVG. No entanto, tenha cuidado ao usar texto em imagens SVG, porque a fonte usada precisará ser instalada no cliente. Uma ótima solução alternativa quando você precisa mostrar texto é sobrepor um rótulo de texto sobre uma imagem.
Avalie se a resolução é apropriada para o fator forma. A resolução de um aplicativo móvel não precisa ser tão alta quanto a resolução de um aplicativo de desktop. Experimente obter o equilíbrio certo entre qualidade e tamanho da imagem.
Se você tiver telas não utilizadas, exclua-as. Tenha cuidado para não excluir nenhuma tela oculta que só os criadores de aplicativos ou administradores usam.
Avalie se você está tentando encaixar muitos fluxos de trabalho em um aplicativo. Por exemplo, você tem telas de administrador e telas de cliente no mesmo aplicativo? Em caso afirmativo, divida-as em aplicativos individuais. Essa abordagem também facilitará o trabalho de várias pessoas nos aplicativos ao mesmo tempo e limitará o "raio de explosão" (quantidade de testes) quando as alterações no aplicativo exigirem uma aprovação completa no teste.
Otimizar ForAll
A função ForAll no Power Apps é usada para percorrer uma tabela de registros e aplicar uma fórmula ou conjunto de fórmulas a cada registro. Embora a função em si seja versátil, o uso indevido da função ForAll pode rapidamente tornar seu aplicativo menos eficiente.
A função ForAll é uma função sequencial singular, em vez de uma função simultânea. Portanto, ela examina apenas um registro por vez, obtém o resultado e continua para o próximo, até que tenha passado por todos os registros em seu escopo.
Evite o Aninhamento de ForAll a todo custo. Isso 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 em lote o banco de dados. No entanto, tenha cuidado ao usar a ordem de For All e Patch.
Seguinte função:
Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
{
demoName:"fromCanvas2"
})
);
Desempenha melhor que:
ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
{
demoName:"test"
})
);