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 em nível ideal é crucial. 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.
À medida que os aplicativos de tela se tornam mais complexos, você pode encontrar problemas com a recuperação de dados, a complexidade das fórmulas e a velocidade de renderização. Para equilibrar a funcionalidade forte com uma interface do usuário responsiva, use uma abordagem sistemática para otimização de código.
Otimização da fórmula do Power Fx
Esta seção fornece as práticas recomendadas para otimizar fórmulas do Power Fx.
Com função
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.
With é melhor do que o 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 Concorrente
A função Concurrent permite que várias fórmulas em uma mesma propriedade sejam avaliadas ao mesmo tempo se tiverem chamadas do conector ou 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 esperam menos tempo 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 Simultânea.
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. Saiba mais sobre a função Coalesce.
Este exemplo requer value1 e value2 deve ser avaliado duas vezes:
If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)
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, essa fórmula corresponde a um número de Seguro Social dos Estados Unidos.
IsMatch(TextInput1.Text, "\d{3}-\d{2}-\d{4}")
Explicação da expressão regular:
\\dCorresponde 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 apps Canvas desempenha um papel crucial na definição de ações que ocorrem quando o aplicativo é aberto. 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. Entenda e use efetivamente a OnStart propriedade para criar aplicativos de tela responsivos e eficientes.
Simplifique a App.OnStart função migrando configurações variáveis para fórmulas nomeadas. Fórmulas nomeadas, especialmente aquelas configuradas no início do ciclo de vida do aplicativo, são 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. Saiba mais em Construir aplicativos canvas grandes e complexos.
Observação
A OnStart propriedade é imperativa. É uma lista ordenada de trabalho que precisa ser feita antes que a primeira tela seja exibida. Como é 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 as otimizações de reordenação e adiamento que poderiam ser feitas de outra forma.
Tela inicial
Se App.OnStart contiver uma Navigate chamada de função, mesmo que esteja em uma If função e raramente chamada, o aplicativo deve concluir a execução de App.OnStart antes de mostrar a primeira tela do aplicativo.
App.StartScreen é uma maneira declarativa de indicar qual tela deve ser mostrada primeiro e não bloqueia otimizações.
A configuração da propriedade StartScreen mostra a primeira tela antes da conclusão de App.OnStart.
App.StartScreen declara qual objeto de tela deve ser mostrado primeiro sem a necessidade de 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)
Mais informações: App.StartScreen: uma alternativa declarativa para navegar em App.OnStart.
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 corrida na qual StartScreen não é aplicada corretamente.
Não crie dependências entre StartScreen e OnStart. Embora o aplicativo bloqueie a referência a variáveis globais em StartScreen, você pode referenciar uma fórmula nomeada que, por sua vez, referencia uma variável global. Essa abordagem pode causar uma condição de corrida na qual a StartScreen não é aplicada corretamente.
Fórmulas nomeadas
Fórmulas nomeadas são estáticas ou constantes que podem ser definidas em App.Formulas. Depois de declarados App.Formulas, eles podem ser usados em qualquer lugar do aplicativo e seus valores sempre permanecem atualizados. Fórmulas nomeadas em Power Apps permitem definir valores ou conjuntos de valores que a plataforma gerencia e atualiza automaticamente. Essa funcionalidade muda a responsabilidade de cálculo de valor e manutenção do desenvolvedor para Power Apps, simplificando o processo de desenvolvimento. Fórmulas nomeadas em Power Apps são um recurso poderoso que pode melhorar significativamente o desempenho e a manutenção do aplicativo.
Fórmulas nomeadas também ajudam ao declarar temas do aplicativo. Ao criar aplicativos empresariais, você geralmente deseja que o aplicativo tenha temas comuns que forneçam uma aparência consistente e experiência do usuário. Para criar um tema, você precisa declarar dezenas para centenas de variáveis em App.OnStart. Essa declaração aumenta o tamanho 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, você pode mover o código App.OnStart a seguir para App.Formulas, o que reduz 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");
Você pode mover o código 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 está na configuração Lookups. Aqui, uma alteração é necessária em uma fórmula Lookup para obter as informações do usuário de Office 365 em vez do Dataverse. Você só precisa fazer a alteração em um só lugar, 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 é extensiva à mudança da tabela de Usuários do Dataverse para o conector do Office 365, sem a necessidade de alterações nas fórmulas espalhadas no aplicativo.
Outra abordagem é otimizar countRows.
varListItems = CountRows(SampleList)
Com a Set função, você deve inicializar a variável varListItems com a contagem inicial de linhas na lista de exemplo e defini-la novamente depois que os itens de lista forem adicionados ou removidos. Com fórmulas nomeadas, conforme os dados são alterados, a varListItems variável é atualizada automaticamente.
As fórmulas nomeadas na App.Formulas propriedade fornecem uma abordagem mais flexível e declarativa para gerenciar valores e cálculos em todo o aplicativo. Eles oferecem vantagens em termos de independência temporal, atualizações automáticas, manutenção e definições imutáveis, em comparação com depender apenas de App.OnStart.
| Aspecto | Fórmulas nomeadas (App.Formulas) | App.OnStart |
|---|---|---|
| Independência de tempo | As fórmulas estão disponíveis instantaneamente e podem ser calculadas em qualquer ordem. | As variáveis podem introduzir dependências de tempo que afetam 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; 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 locais. |
| Definições imutáveis | As definições App.Formulas de fórmula são imutáveis. |
Valores variáveis podem ser suscetíveis a alterações acidentais. |
Funções definidas pelo usuário
as funções definidas User no Power Apps Studio permitem que você crie suas próprias funções personalizadas.
Defina uma fórmula de App.Formulas da seguinte maneira:
FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula
O código funciona da seguinte maneira:
FunctionNameinvoca a função.Parameteré o nome da entrada. Você pode incluir uma ou mais entradas.DataTypeé o tipo de dados que o argumento passado para a função deve corresponder. Os tipos de dados disponíveis incluem Boolean, Color, Date, Datetime, Dynamic, GUID, Hyperlink, Text e Time.OutputDataTypeé o tipo de dados para a saída da função.Formulaé a saída da função.
Use IfError para implementar o tratamento de erros dentro da função definida:
// Function to calculate the area of a circle based on the radius
calcAreaOfCircle(radius: Number): Number =
IfError(Pi() * radius * radius, 0);
Chame a função definida de um controle de texto ou rótulo.
calcAreaOfCircle(Int(*TextInput1*.Text))
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. Mantenha seu Power App limpo e organizado para melhorar o desempenho e facilitar o desenvolvimento.
Otimizar coleções
Estruturas de armazenamento temporário são utilizadas para armazenar e manipular dados em um aplicativo do Power Apps. No entanto, as coleções podem causar sobrecarga de desempenho. 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 essa abordagem 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
ShowColumnspara obter apenas colunas específicas. Adicione a funçãoFilterpara obter apenas dados relevantes.A função de exemplo a seguir retorna todo o conjunto de dados:
ClearCollect(colDemoAccount, Accounts);Compare essa função 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 Power Apps, elas permitem que você interaja com os dados com eficiência, mesmo quando você 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 as variáveis e mídia não utilizados possam não afetar significativamente o desempenho do aplicativo, é importante limpar seu aplicativo removendo qualquer mídia ou variáveis não utilizados.
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
Para otimizar telas e controles em Power Apps, considere as práticas recomendadas a seguir.
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. Essa abordagem pode forçar o aplicativo a carregar as outras telas em vez de esperar até que o usuário vá para essa tela. Para resolver esse problema, use variáveis, coleções e contexto de navegação para compartilhar o estado entre telas.
O verificador de aplicativos no Power Apps Studio mostra os controles que são referenciados cruzadamente. Revise o verificador de aplicativos regularmente para corrigir esse problema.
Na imagem a seguir, o controle Galeria 1 é referenciado no controle Rótulo 2 da Tela 2.
Se você fizer referência a um controle da primeira tela no aplicativo na segunda tela do aplicativo, não haverá nenhum impacto no desempenho porque a primeira tela já está carregada. Esse comportamento é realmente benéfico 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 chamado Label 3 da tela 3, o aplicativo carregará essa tela na memória.
Habilitar DelayOutput para controles de texto
A configuração DelayOutput , quando definida como true, registra a entrada do usuário após um atraso de meio segundo. Esse atraso é útil para adiar operações caras até que o usuário conclua a inserção de texto, como filtragem quando a entrada é usada em outras fórmulas.
Por exemplo, considere uma galeria cujos Itens são filtrados dependendo do que o usuário insere no controle TextInput:
Se você definir DelayOutput como false, que é o padrão, a galeria filtra 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. Esse comportamento é prático quando você está usando a
TextInputcadeia de caracteres de pesquisa ou aStartsWithfunção.Se você definir DelayOutput como true, haverá um pequeno atraso antes que as alterações sejam detectadas. Esse atraso fornece tempo para concluir a digitação. O atraso funciona bem com a propriedade
TextInput.OnChange. Se você tiver ações vinculadas a alterações, não as deseja disparadas até terminar de digitar no campo.
Delegação e processamento do lado do servidor
O uso de delegação e processamento no lado do servidor permite que seu aplicativo lide com eficiência com grandes conjuntos de dados, ao transferir operações para a fonte de dados.
Delegação
A delegação no Power Apps refere-se à capacidade do aplicativo de descarregar determinadas operações para a fonte de dados subjacente, em vez de processar as operações em Power Apps em si. Usando a delegação em Power Apps, você pode criar aplicativos mais eficientes e escalonáveis que têm um bom desempenho mesmo em cenários que envolvem grandes conjuntos de dados. Esteja ciente das limitações de delegação para fontes de dados e operações específicas e projete seu aplicativo adequadamente para obter o desempenho ideal.
Observação
Nem todas as funções são delegadas. Saiba mais sobre a delegação em limitações de consulta: limites de delegação e consulta.
A delegação tem várias vantagens, como otimização de consulta e 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 realizar junções de tabelas para criar coleções dentro do seu aplicativo Canvas. Considere o exemplo a seguir. No exemplo, há duas tabelas: Motoristas e Caminhões. O código cria uma coleção de motoristas e informações sobre os caminhões e, para cada caminhão, chama o motorista que é proprietário do veículo.
// 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 união no aplicativo de tela interativa 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 no lado do servidor
Diferentes fontes de dados, como SQL e Dataverse, permitem delegar o processamento de dados, como filtros e pesquisas, à fonte de dados. Em 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
Otimizar a forma como seu aplicativo consulta dados pode reduzir significativamente os tempos de carregamento e melhorar a capacidade de resposta geral.
Utilize seleção de colunas explícitas
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 quando não consegue determinar se elas são usadas. Para forçar o ECS a manter uma coluna ausente, use a expressão ShowColumns Power Fx após uma referência de coleção ou em um controle.
Evite chamar 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 ao Power Automate adiciona latência de rede e um custo de desempenho de 0,6 segundos para instanciar o fluxo do Power Automate.
O uso excessivo de fluxos do Power Automate também pode levar a limites de execução e estrangulamento de desempenho. Sempre avalie as compensações entre a latência de rede e o 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. Esse problema pode levar a problemas de desempenho, pois cada consulta extra incorre em sobrecarga.
Uma chamada simples como esta para carregar uma coleção pode gerar chamadas N+1 para a 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 objetos View em SQL Server para evitar problemas de consulta N+1 ou altere a interface do usuário para evitar disparar o 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 RelatedDataSource o tamanho for pequeno (menos de 500 registros), armazene-o em cache em uma coleção e use a coleção para conduzir o cenário de consulta pesquisa (N+1).
Limitar o tamanho do pacote
Embora Power Apps otimiza o carregamento de aplicativos, você pode tomar medidas para reduzir o volume de seus aplicativos. Um footprint 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 a mídia inserida em seu aplicativo. Se algo não for usado, exclua-o.
Por exemplo, as imagens inseridas podem ser muito grandes. Em vez de arquivos PNG, veja se você pode usar imagens SVG. Tenha cuidado com o uso de texto em imagens SVG porque a fonte deve ser instalada no cliente. Uma 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 de formato. 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 facilita que várias pessoas trabalhem nas aplicações ao mesmo tempo e limita o "raio de explosão" (quantidade de testes) quando as alterações de aplicativo exigem uma passagem completa de testes.
Otimizar ForAll
A função ForAll em Power Apps é usada para iterar por meio de 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 ForAll uso inadequado da função pode rapidamente tornar seu aplicativo menos performante.
A ForAll função é uma função sequencial singular em vez de uma função simultânea. Portanto, ele examina apenas um registro de cada vez, obtém o resultado e, em seguida, continua para o próximo registro até passar por todos os registros em seu escopo.
Evite aninhamento ForAll. Essa prática pode levar a iterações exponencial e afetar significativamente o desempenho.
ClearCollect(FollowUpMeetingAttendees.ForAll(ForAll(Distinct(AttendeesList.EmailAddress.Address).Lookup(Attendees))))
Atualizar o banco de dados em lote
Você pode usar ForAll e Patch atualizar em lote o banco de dados. No entanto, tenha cuidado ao usar a ordem de ForAll e Patch.
A função a seguir é a melhor abordagem, por exemplo:
Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
{
demoName:"fromCanvas2"
})
);
Considerando que a abordagem a seguir é menos eficiente:
ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
{
demoName:"test"
})
);