Otimizar o desempenho do aplicativo de tela no Power appsOptimize canvas-app performance in Power Apps

A Microsoft está trabalhando muito para melhorar o desempenho de todos os aplicativos executados na plataforma Power apps.Microsoft is working hard to improve the performance of all apps that run on the Power Apps 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 – recupera metadados, como a versão da plataforma do Power apps na qual o aplicativo é executado e as fontes das quais ele deve recuperar dados.Gets metadata - Retrieves metadata such as the version of the Power Apps 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. É mais provável que seu aplicativo demore mais de 15 segundos para retornar dados se ele solicitar dados com frequência de mais de 30 fontes de dados, como Common Data Service, SQL Azure, SharePoint e 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 Power apps gera um DOM HTML para renderizar cada controle.Power Apps generates an HTML DOM to render each control. Quanto mais controles você adicionar, mais tempo os aplicativos de capacidade de geração precisam.The more controls you add, the more generation time Power Apps 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 paralelo

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 somente 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, a tela 1 for carregada e uma de suas fórmulas usar uma propriedade de um controle da tela 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, a tela 2 deve ser carregada para atender à dependência antes que a tela 1 possa ser exibida.Now screen 2 must be loaded to fulfill the dependency before screen 1 can be displayed. Imagine que a tela 2 tenha uma dependência na tela 3, que tem outra dependência na tela 4 e assim por diante.Imagine screen 2 has a dependency on screen 3, which has another dependency on screen 4, and so on. Essa cadeia de dependência pode fazer com que várias telas sejam carregadas.This dependency chain can cause many screens to be loaded.

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

Há uma exceção.There is an exception. No exemplo anterior, imagine que a única maneira de exibir a tela 1 é navegar pela tela 2.In the previous example imagine that the only way to display screen 1 is by navigating from screen 2. Em seguida, a tela 2 já teria sido carregada na memória quando a tela 1 fosse carregada.Then screen 2 would have already been loaded in memory when screen 1 was to be loaded. Nenhum trabalho adicional é necessário para atender à dependência para a tela 2 e, portanto, não há 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 dicas, consulte trabalhando com grandes listas do SharePoint no Power apps (postagem de blog).For more tips, see Working with large SharePoint lists in Power Apps (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

Republique seus aplicativos (postagem de blog) para obter melhorias de desempenho e recursos adicionais da plataforma Power apps.Republish your apps (blog post) to get performance improvements and additional features from the Power Apps platform.

Evite repetir a mesma fórmula em vários locaisAvoid repeating the same formula in multiple places

Se várias propriedades executarem a mesma fórmula (especialmente se for complexa), considere configurá-la uma vez e, em seguida, referenciar a saída da primeira propriedade nos itens 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 propriedade DisplayMode dos controles a, B, C, D e e como 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 vez disso, defina a propriedade DisplayMode para a fórmula complexa, defina a propriedade DisplayMode do B como o resultado da propriedade DisplayMode de uma 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.

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

Se você tiver várias fórmulas ou regras que fazem referência ao valor de um controle de entrada de texto , defina a propriedade DelayedOutput desse controle como 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. A propriedade Text desse controle será atualizada somente depois que os pressionamentos de teclas inseridos em uma rápida sucessão forem interrompidos.The Text property of that control will be updated only after keystrokes entered in quick succession have ceased. As fórmulas ou as regras não serão executadas quantas vezes e o desempenho do aplicativo melhorará.The formulas or rules won't run as many times, and app performance will improve.

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

Se você referenciar um valor de entrada de usuário em uma regra ou fórmula usando uma variável Form. Updates , ele itera todos os cartões de dados do formulário e cria um registro a 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 seu aplicativo mais eficiente, faça referência ao valor diretamente do cartão de dados ou do valor de controle.To make your app more efficient, reference the value directly from the data card or the control value.

Passos seguintesNext steps

Examine os padrões de codificação para maximizar o desempenho do aplicativo e manter os aplicativos mais fáceis de manter.Review the coding standards for maximizing app performance and keeping apps easier to maintain.