Otimizar o desempenho de aplicações baseadas em telas no PowerAppsOptimize canvas-app performance in PowerApps

A Microsoft está a trabalhar arduamente para melhorar o desempenho de todas as aplicações executadas na plataforma PowerApps.Microsoft is working hard to improve the performance of all apps that run on the PowerApps platform. Contudo, pode seguir as melhores práticas descritas neste tópico para melhorar o desempenho das aplicações que cria.But you can follow the best practices in this topic to boost the performance of apps that you create.

Quando um utilizador abre uma aplicação, esta passa por estas fases de execução antes de mostrar a interface de utilizador:When a user opens an app, it goes through these phases of execution before showing any user interface:

  1. Autentica o utilizador – se o utilizador nunca abriu a aplicação, é-lhe pedido para iniciar sessão com as credenciais para as ligações de que a aplicação precisa.Authenticates the user - Prompts the user, if that person has never opened the app before, to sign in with credentials for whatever connections the app needs. Se o mesmo utilizador voltar a abrir a aplicação, poderá ter de iniciar sessão novamente com essas credenciais, dependendo das políticas de segurança da organização.If the same user opens the app again, that person might be prompted again, depending on the organization’s security policies.
  2. Obtém metadados – obtém metadados, tais como a versão da plataforma PowerApps em que a aplicação é executada e as origens a partir das quais tem de obter os dados.Gets metadata - Retrieves metadata such as the version of the PowerApps platform on which the app runs and the sources from which it must retrieve data.
  3. Inicializa a aplicação – realiza todas as tarefas especificadas na propriedade OnStart.Initializes the app - Performs any tasks specified in the OnStart property.
  4. Compõe ecrãs – compõe o primeiro ecrã com controlos que a aplicação preencheu com dados.Renders screens - Renders the first screen with controls that the app has populated with data. Se o utilizador abrir outros ecrãs, a aplicação irá compô-los recorrendo ao mesmo processo.If the user opens other screens, the app renders them by using the same process.

Limitar ligações de dadosLimit data connections

Não ligue a mais de 30 origens de dados a partir da mesma aplicação.Don’t connect to more than 30 data sources from the same app. As aplicações pedem aos novos utilizadores que iniciem sessão em cada conector, por isso cada conector adicional aumenta o tempo de que a aplicação precisa para iniciar.Apps prompt new users to sign in to each connector, so every additional connector increases the amount of time that the app needs to start. Durante a execução da aplicação, cada conector necessita de recursos da CPU, memória e largura de banda de rede quando a aplicação pede dados dessa origem.As an app runs, each connector requires CPU resources, memory, and network bandwidth when the app requests data from that source.

Pode medir rapidamente o desempenho da sua aplicação ao ativar as Ferramentas de Programação no Microsoft Edge ou no Google Chrome durante a execução da aplicação.You can quickly measure your app’s performance by turning on Developer Tools in Microsoft Edge or Google Chrome while running the app. A aplicação é mais provável que demorar mais do que 15 segundos para retornar dados, se ele com frequência solicita dados de mais de 30 origens de dados, como o Common Data Service, o SQL do Azure, o SharePoint e o Excel no OneDrive.Your app is more likely to take longer than 15 seconds to return data if it frequently requests data from more than 30 data sources, such as Common Data Service, Azure SQL, SharePoint, and Excel on OneDrive.

Limitar o número de controlosLimit the number of controls

Não adicione mais de 500 controlos à mesma aplicação.Don’t add more than 500 controls to the same app. O PowerApps gera um DOM de HTML para compor cada controlo.PowerApps generates an HTML DOM to render each control. Quantos mais controlos adicionar, mais tempo de geração será necessário por parte do PowerApps.The more controls you add, the more generation time PowerApps needs.

Em alguns casos, pode alcançar o mesmo resultado e fazer com que a aplicação inicie mais rapidamente se utilizar uma galeria em vez de controlos individuais.You can, in some cases, achieve the same result and have the app start faster if you use a gallery instead of individual controls. Para além disso, é aconselhável reduzir o número de tipos de controlo no mesmo ecrã.In addition, you might want to reduce the number of control types on the same screen. Alguns controlos (por exemplo, o visualizador de PDF, a tabela de dados e a caixa de combinação) extraem grandes scripts de execução e demoram mais tempo a compor.Some controls (such as PDF viewer, data table, and combo box) pull in large execution scripts and take longer to render.

Otimizar a função OnStartOptimize the OnStart function

Utilize a função ClearCollect para colocar os dados em cache localmente se não forem alterados durante a sessão de utilizador.Use the ClearCollect function to cache data locally if it doesn’t change during the user session. Para além disso, utilize a função Concurrent para carregar origens de dados em simultâneo.Also, use the Concurrent function to load data sources simultaneously.

Tal como este tópico de referência demonstra, pode utilizar a função Concurrent para reduzir para metade o tempo de que uma aplicação precisa para carregar dados.As this reference topic demonstrates, you can use Concurrent to cut the amount of time an app needs to load data in half.

Sem a função Concurrent, esta fórmula carrega as quatro tabelas uma de cada vez:Without the Concurrent function, this formula loads each of four tables one at a time:

ClearCollect( Product, '[SalesLT].[Product]' );
ClearCollect( Customer, '[SalesLT].[Customer]' );
ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' );
ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )

Pode confirmar este comportamento nas Ferramentas de Programação para o seu browser:You can confirm this behavior in the Developer Tools for your browser:

ClearCollect em série

Pode incluir a mesma fórmula na função Concurrent para reduzir o tempo geral de que a operação necessita:You can enclose the same formula in the Concurrent function to reduce the overall time that the operation needs:

Concurrent( 
    ClearCollect( Product, '[SalesLT].[Product]' ),
    ClearCollect( Customer, '[SalesLT].[Customer]' ),
    ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ),
    ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' ))
    

Com esta alteração, a aplicação obtém as tabelas em paralelo:With this change, the app fetches the tables in parallel:

ClearCollect paralela

Colocar dados de pesquisa em cacheCache lookup data

Utilize a função Set para colocar os dados de tabelas de pesquisa em cache localmente para evitar obter dados repetidamente da origem.Use the Set function to cache data from lookup tables locally to avoid repeatedly retrieving data from the source. Esta técnica otimiza o desempenho se for provável que os dados não mudem durante uma sessão.This technique optimizes performance if the data probably won’t change during a session. Tal como mostra este exemplo, os dados são obtidos da origem uma vez e, em seguida, são referenciados localmente até o utilizador fechar a aplicação.As in this example, the data is retrieved from the source once and then referenced locally after that until the user closes the app.

Set(CustomerOrder, Lookup(Order, id = “123-45-6789”));
Set(CustomerName, CustomerOrder.Name);
Set(CustomerAddress, CustomerOrder.Address);
Set(CustomerEmail, CustomerOrder.Email);
Set(CustomerPhone, CustomerOrder.Phone);

As informações de contacto, os valores predefinidos e as informações do utilizador não mudam frequentemente.Contact information doesn’t change frequently, and neither do default values and user information. Portanto, pode normalmente utilizar esta técnica também com as funções Defaults e User.So you can generally use this technique with the Defaults and User functions also.

Evitar a dependência de controlos entre ecrãsAvoid controls dependency between screens

Para melhorar o desempenho, as telas de um aplicativo são carregadas na memória apenas conforme necessário.To improve performance, the screens of an app are loaded into memory only as they are needed. Essa otimização pode ser dificultada se, por exemplo, o ecrã 1 é carregado e uma das suas fórmulas usa uma propriedade de um controlo no ecrã 2.This optimization can be hampered if, for example, screen 1 is loaded and one of its formulas uses a property of a control from screen 2. Agora o ecrã 2 têm de ser carregado para satisfazer a dependência antes do ecrã 1 pode ser apresentado.Now screen 2 must be loaded to fulfill the dependency before screen 1 can be displayed. Imagine a tela 2 tem uma dependência no ecrã 3, que tem outra dependência no ecrã 4 e assim por diante.Imagine screen 2 has a dependency on screen 3, which has another dependency on screen 4, and so on. Esta cadeia de dependência pode fazer com que várias telas ao ser carregado.This dependency chain can cause many screens to be loaded.

Por esse motivo, evite fórmulas dependências entre ecrãs.For this reason avoid formula dependencies between screens. Em alguns casos pode utilizar uma variável global ou uma coleção de compartilhar informações entre ecrãs.In some cases you can use a global variable or collection to share information between screens.

Existe uma exceção.There is an exception. No exemplo anterior, imagine que a única forma de apresentar o ecrã 1 é ao navegar a partir do ecrã 2.In the previous example imagine that the only way to display screen 1 is by navigating from screen 2. Em seguida, tela 2 seria já foram carregada na memória quando a tela 1 estava a ser carregado.Then screen 2 would have already been loaded in memory when screen 1 was to be loaded. Nenhum trabalho adicional é necessária para satisfazer a dependência de tela de 2 e, portanto, não há nenhum impacto no desempenho.No additional work is needed to fulfill the dependency for screen 2 and therefore there's no performance impact.

Utilizar a delegaçãoUse delegation

Sempre que possível, utilize funções que delegam o processamento de dados à origem de dados em vez de obter dados para que o dispositivo local os processe.Where possible, use functions that delegate data processing to the data source instead of retrieving data to the local device for processing. Se uma aplicação tiver de processar dados localmente, a operação exigirá muito mais poder de processamento, memória e largura de banda de rede, especialmente se o conjunto de dados for grande.If an app must process data locally, the operation requires much more processing power, memory, and network bandwidth, especially if the data set is large.

Tal como mostra esta lista, diferentes origens de dados suportam delegação de funções diferentes:As this list shows, different data sources support delegation from different functions:

Utilizar a delegação

Por exemplo, as listas do SharePoint suportam a delegação da função Filter, mas não da função Search.For example, SharePoint lists support delegation from the Filter function but not the Search function. Portanto, deve utilizar a função Filter em vez da função Search para localizar itens numa galeria se a lista do SharePoint contiver mais de 500 itens.So you should use Filter instead of Search to find items in a gallery if the SharePoint list contains more than 500 items. Para obter mais sugestões, veja Trabalhar com grandes listas do SharePoint no PowerApps (mensagem de blogue).For more tips, see Working with large SharePoint lists in PowerApps (blog post).

Utilizar a Carga AtrasadaUse Delayed Load

Ative a funcionalidade experimental Carga Atrasada se a sua aplicação tiver mais de 10 ecrãs, se não tiver regras e se tiver muitos controlos em múltiplos ecrãs diretamente vinculados à origem de dados.Turn on the experimental feature for Delayed Load if your app has more than 10 screens, no rules, and many controls that are on multiple screens and that are directly bound to the data source. Se criar este tipo de aplicação e não ativar esta funcionalidade, o desempenho da aplicação poderá diminuir porque os controlos em todos os ecrãs têm de ser preenchidos, mesmo nos ecrãs que não estão abertos.If you build this type of app and don’t enable this feature, app performance may suffer because the controls in all screens must be populated even on screens that aren’t open. Para além disso, todos os ecrãs da aplicação têm de ser atualizados sempre que a origem de dados for alterada, por exemplo, quando o utilizador adiciona um registo.Also, all screens of the app must be updated whenever the data source changes, such as when the user adds a record.

Trabalhar com grandes conjuntos de dadosWorking with large data sets

Utilize origens de dados e fórmulas que possam ser delegadas para que as suas aplicações continuem a ter um bom desempenho, permitindo sempre que os utilizadores acedam a todas as informações necessárias, e evite atingir o limite da linha de dados, ou seja, 2000, para consultas não delegáveis.Use data sources and formulas that can be delegated to keep your apps performing well while users can access all the information they need, and avoid hitting the data row limit of 2000 for non-delegable queries. Relativamente às colunas de registo de dados nas quais os utilizadores podem procurar, filtrar ou ordenar dados, esses índices de colunas foram bem concebidos, tal como estes documentos descrevem, para o SQL Server e o SharePoint.For data-record columns on which users can search, filter, or sort data, those indexes of columns are designed well as these docs describe for SQL Server and SharePoint.

Voltar a publicar aplicações regularmenteRepublish apps regularly

Volte a publicar as suas aplicações (mensagem de blogue) para obter melhorias em termos de desempenho e funcionalidades adicionais da plataforma PowerApps.Republish your apps (blog post) to get performance improvements and additional features from the PowerApps platform.

Evitar a repetição a mesma fórmula em vários locaisAvoid repeating the same formula in multiple places

Se várias propriedades de executam a mesma fórmula (especialmente se for complexa), considere defini-lo uma vez e, em seguida, referenciar a saída da primeira propriedade naqueles subsequentes.If multiple properties run the same formula (especially if it's complex), consider setting it once and then referencing the output of the first property in subsequent ones. Por exemplo, não defina a DisplayMode propriedade dos controles A, B, C, D e de E para a mesma fórmula complexa.For example, don't set the DisplayMode property of controls A, B, C, D and E to the same complex formula. Em alternativa, defina do DisplayMode propriedade como a fórmula complexa, definida de B DisplayMode propriedade para o resultado do DisplayMode propriedade, e assim por diante para C, D e E.Instead, set A's DisplayMode property to the complex formula, set B's DisplayMode property to the result of A's DisplayMode property, and so on for C, D, and E.

Ativar DelayOutput em todos os controles de entrada de textoEnable DelayOutput on all Text input controls

Se tiver várias fórmulas ou regras que referenciam o valor de um introdução de texto , defina o DelayedOutput propriedade desse controlo para true.If you have multiple formulas or rules that reference the value of a Text input control, set the DelayedOutput property of that control to true. O texto propriedade desse controlo será atualizada apenas depois de tem deixou pressionamentos de teclas introduzidos numa rápida sucessão.The Text property of that control will be updated only after keystrokes entered in quick succession have ceased. Regras de fórmulas ou não será executado o número de vezes e irá melhorar o desempenho da aplicação.The formulas or rules won't run as many times, and app performance will improve.

Evite utilizar Form.Updates em regras e fórmulasAvoid using Form.Updates in rules and formulas

Se fizer referência um valor de entrada do usuário de uma fórmula ou uma regra ao utilizar um Form.Updates variável, ele é iterada em cartões de dados do formulário e cria um registo de cada vez.If you reference a user-input value in a rule or a formula by using a Form.Updates variable, it iterates over all the form’s data cards and creates a record each time. Para tornar a sua aplicação mais eficiente, referenciar o valor diretamente a partir do cartão de dados ou o valor de controle.To make your app more efficient, reference the value directly from the data card or the control value.

Passos seguintesNext steps

Reveja os padrões de codificação para maximizar o desempenho de aplicações e manter as aplicações mais fácil de manter.Review the coding standards for maximizing app performance and keeping apps easier to maintain.