Optimera prestanda för appar för arbetsytor i PowerAppsOptimize canvas-app performance in PowerApps

Microsoft arbetar hårt för att förbättra prestanda för alla appar som körs på PowerApps-plattformen.Microsoft is working hard to improve the performance of all apps that run on the PowerApps platform. Men du kan följa metodtipsen i det här avsnittet för att höja prestandan hos appar som du skapar.But you can follow the best practices in this topic to boost the performance of apps that you create.

När en användare öppnar en app så genomgår den de här faserna för körning innan något användargränssnitt visas:When a user opens an app, it goes through these phases of execution before showing any user interface:

  1. Autentiserar användaren – uppmanar användaren, om personen aldrig har öppnat appen innan, att logga in med autentiseringsuppgifterna för de anslutningar som appen behöver.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. Om samma användare öppnar appen igen, kan den personen uppmanas igen, beroende på organisationens säkerhetsprinciper.If the same user opens the app again, that person might be prompted again, depending on the organization’s security policies.
  2. Hämtar metadata – hämtar metadata, till exempel versionen av PowerApps-plattform på vilken appen körs och de källor som den måste hämta data från.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. Initierar appen – utför alla uppgifter som anges i OnStart-egenskapen.Initializes the app - Performs any tasks specified in the OnStart property.
  4. Återger skärmar – renderas den första skärmen med kontroller som appen har fyllt med data.Renders screens - Renders the first screen with controls that the app has populated with data. Om användaren öppnar andra skärmar, renderar appen dem genom att använda samma process.If the user opens other screens, the app renders them by using the same process.

Begränsa dataanslutningarLimit data connections

Anslut inte till mer än 30 datakällor från samma app.Don’t connect to more than 30 data sources from the same app. Appar uppmana nya användare att logga in på varje anslutning, så att varje ytterligare anslutningsprogram ökar mängden tid som appen behöver för att starta.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. Eftersom en app körs, kräver varje anslutningsapp CPU-resurser, minne och nätverksbandbredd när appen begär data från den källan.As an app runs, each connector requires CPU resources, memory, and network bandwidth when the app requests data from that source.

Du kan snabbt mäta din apps prestanda genom att aktivera utvecklarverktyg i Microsoft Edge eller Google Chrome vid körning av appen.You can quickly measure your app’s performance by turning on Developer Tools in Microsoft Edge or Google Chrome while running the app. Din app är mer troligt att ta längre tid än 15 sekunder att returnera data om det ofta begär data från mer än 30 datakällor, till exempel Common Data Service, Azure SQL, SharePoint och Excel på 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.

Begränsa antalet kontrollerLimit the number of controls

Lägg inte till fler än 500 kontroller med samma app.Don’t add more than 500 controls to the same app. PowerApps genererar en HTML DOM för att rendera varje kontroll.PowerApps generates an HTML DOM to render each control. Ju fler kontroller som du lägger till, desto längre generationstid behöver PowerApps.The more controls you add, the more generation time PowerApps needs.

Du kan i vissa fall kan uppnå samma resultat och få appen att starta snabbare om du använder ett galleri istället för enskilda kontroller.You can, in some cases, achieve the same result and have the app start faster if you use a gallery instead of individual controls. Dessutom kan du minska antalet kontrolltyper på samma skärm.In addition, you might want to reduce the number of control types on the same screen. Vissa kontroller (som PDF-visningsprogram, datatabell och kombinationsruta) drar in stora körningsskript och tar längre tid att rendera.Some controls (such as PDF viewer, data table, and combo box) pull in large execution scripts and take longer to render.

Optimera OnStart-funktionenOptimize the OnStart function

Använd funktionen ClearCollect för att cachelagra data lokalt om det inte ändras under användarens session.Use the ClearCollect function to cache data locally if it doesn’t change during the user session. Du kan också använda funktionen samtidiga för att läsa in datakällor samtidigt.Also, use the Concurrent function to load data sources simultaneously.

Som det här referensavsnittet visar, kan du använda samtidiga för att minska tiden ett program behöver för att läsa in data till hälften.As this reference topic demonstrates, you can use Concurrent to cut the amount of time an app needs to load data in half.

Utan funktionen samtidiga läser den här formeln in var och en av fyra tabeller en i taget: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]' )

Du kan bekräfta det här beteendet i utvecklarverktygen för din webbläsare:You can confirm this behavior in the Developer Tools for your browser:

Seriell ClearCollect

Du kan bädda in formeln i funktionen Samtidiga för att minska den totala tid som krävs för åtgärden: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]' ))
    

Med den här ändringen så hämtar appen tabellerna parallellt:With this change, the app fetches the tables in parallel:

Parallell ClearCollect

Cachedata för sökningCache lookup data

Använd funktionen Ange för att cachelagra data från söktabeller lokalt för att undvika upprepade datahämtningar från källan.Use the Set function to cache data from lookup tables locally to avoid repeatedly retrieving data from the source. Den här tekniken optimerar prestanda om data förmodligen inte kommer att ändras under en session.This technique optimizes performance if the data probably won’t change during a session. Som i följande exempel så hämtas data från källan en gång och refereras sedan till lokalt efter det, tills dess att användaren stänger appen.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);

Kontaktinformationen ändras inte ofta och inte standardvärden eller användarinformation heller.Contact information doesn’t change frequently, and neither do default values and user information. Så du kan generellt sätt använda den här tekniken med funktionerna Standardvärden och Användare också.So you can generally use this technique with the Defaults and User functions also.

Undvika kontrollberoende mellan skärmarnaAvoid controls dependency between screens

Om en kontrolls värde beror på värdet för en kontroll i en annan skärm, hanterar du data med en variabel, en samling eller en datakällsreferens.If a control’s value depends on the value of a control on a different screen, manage the data by using a variable, a collection, or a data-source reference.

Använd globala variablerUse global variables

Om du vill skicka appens tillstånd från en skärm till en annan, skapar du eller ändrar ett globalt variabelvärde med funktionen Ange istället för att använda funktionerna Navigera och UpdateContext).To pass the app’s state from one screen to another, create or modify a global variable value by using the Set function instead of by using the Navigate and UpdateContext) functions.

Använd delegeringUse delegation

Om möjligt, använder du funktioner som delegerar databehandling till datakällan istället för att hämta data till den lokala enheten för bearbetning.Where possible, use functions that delegate data processing to the data source instead of retrieving data to the local device for processing. Om en app måste bearbeta data lokalt, kräver åtgärden mycket mer processorkraft, minne och nätverksbandbredd, särskilt om datauppsättningen är stor.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.

Som den här listan visar, stöder olika datakällor delegering från olika funktioner:As this list shows, different data sources support delegation from different functions:

Använd delegering

SharePoint-listor stöder till exempel delegering från den funktionen Filter men inte funktionen Search.For example, SharePoint lists support delegation from the Filter function but not the Search function. Så du bör använda Filtrera istället för Sök för att hitta objekt i ett galleri om SharePoint-listan innehåller fler än 500 objekt.So you should use Filter instead of Search to find items in a gallery if the SharePoint list contains more than 500 items. Fler tips finns i Arbeta med stora SharePoint-listor i PowerApps (blogginlägg).For more tips, see Working with large SharePoint lists in PowerApps (blog post).

Använd fördröjd inläsningUse Delayed Load

Aktivera den experimentella funktionen för fördröjd inläsning om din app har fler än 10 skärmar, inga regler och många kontroller som finns på flera skärmar och som är direkt kopplade till datakällan.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. Om du skapar den här typen av app och inte aktiverar den här funktionen så kan appens prestanda försämras eftersom kontrollerna i alla skärmar måste fyllas i även på skärmar som inte är öppna.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. Dessutom måste alla skärmar i appen uppdateras när datakällan ändras, till exempel när användaren lägger till en post.Also, all screens of the app must be updated whenever the data source changes, such as when the user adds a record.

Arbeta med stora datauppsättingarWorking with large data sets

Använd datakällor och formler som kan delegeras så att dina program fungerar bra medan användare kan komma åt den information de behöver och undvika att nå dataradsgränsen på 2000 för frågor som inte kan delegeras.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. För datapostkolumner där användare kan söka, filtrera eller sortera data, är de indexen med kolumner väl designade som dessa dokument beskriver för SQL Server och 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.

Ompublicera appar regelbundetRepublish apps regularly

Ompublicera dina appar (blogginlägg) för att få prestandaförbättringar och ytterligare funktioner från PowerApps-plattformen.Republish your apps (blog post) to get performance improvements and additional features from the PowerApps platform.

Undvika att upprepa samma formel på flera platserAvoid repeating the same formula in multiple places

Om flera egenskaper för kör samma formel (särskilt om det är komplicerat) kan du ställa in en gång och sedan referera till utdata från den första egenskapen i efterföljande fält.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. Till exempel inte ange den DisplayMode egenskapen kontrollernas A, B, C, D och E till samma komplexa formel.For example, don't set the DisplayMode property of controls A, B, C, D and E to the same complex formula. Ange i stället A: s DisplayMode komplexa formeln ange B: s DisplayMode egenskapen i resultatet av DisplayMode egenskap, och så vidare till C, D och 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.

Aktivera DelayOutput på alla textkontrollerEnable DelayOutput on all Text input controls

Om du har flera formler eller regler som refererar till värdet för en textinmatning genom att ange den DelayedOutput egenskap för kontrollen till 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. Den Text egenskap för kontrollen uppdateras bara när tangenttryckningar som angetts i snabb följd upphört.The Text property of that control will be updated only after keystrokes entered in quick succession have ceased. Formler eller regler köras inte så många gånger och prestanda förbättras.The formulas or rules won't run as many times, and app performance will improve.

Undvik att använda Form.Updates i regler och formlerAvoid using Form.Updates in rules and formulas

Om du refererar till ett användarindata värde i en regel eller en formel med hjälp av en Form.Updates variabel, det itererar över alla datakort och skapa en post varje gång.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. Om du vill göra din app mer effektivt, referera till värdet direkt från datakort eller kontrollvärdet.To make your app more efficient, reference the value directly from the data card or the control value.

Nästa stegNext steps

Granska den kodning standarder för att maximera prestanda och att hålla appar enklare att underhålla.Review the coding standards for maximizing app performance and keeping apps easier to maintain.