Optimieren der Leistung von Canvas-Apps in PowerAppsOptimize canvas-app performance in PowerApps

Microsoft arbeitet beständig daran, die Leistung aller Apps zu verbessern, die auf der PowerApps-Plattform ausgeführt werden.Microsoft is working hard to improve the performance of all apps that run on the PowerApps platform. Sie können aber die Best Practices in diesem Thema befolgen, um die Leistung der von Ihnen erstellten Apps noch weiter zu steigern.But you can follow the best practices in this topic to boost the performance of apps that you create.

Wenn ein Benutzer eine App öffnet, durchläuft sie folgende Ausführungsphasen, bevor eine Benutzeroberfläche angezeigt wird:When a user opens an app, it goes through these phases of execution before showing any user interface:

  1. Authentifizierung des Benutzers: Der Benutzer wird, sofern er diese App zuvor noch nie geöffnet hatte, aufgefordert, sich mit den Anmeldeinformationen anzumelden, die für die Verbindungen der App erforderlich sind.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. Wenn dieser Benutzer die App erneut öffnet, wird er möglicherweise erneut zur Angabe dieser Informationen aufgefordert, je nach Sicherheitsrichtlinien der Organisation.If the same user opens the app again, that person might be prompted again, depending on the organization’s security policies.
  2. Abrufen der Metadaten: Die Metadaten werden abgerufen, z.B. die Version der PowerApps-Plattform, auf der die App ausgeführt wird, und die Quellen, aus denen Daten abgerufen werden müssen.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. Initialisieren der App: Tasks, die in der OnStart-Eigenschaft angegeben sind, werden ausgeführt.Initializes the app - Performs any tasks specified in the OnStart property.
  4. Rendern der Bildschirme: Der erste Bildschirm, der das Auffüllen der App mit Daten steuert, wird gerendert.Renders screens - Renders the first screen with controls that the app has populated with data. Wenn der Benutzer weitere Bildschirme öffnet, rendert die App diese mithilfe des gleichen Prozesses.If the user opens other screens, the app renders them by using the same process.

Einschränken von DatenverbindungenLimit data connections

Stellen Sie in ein und derselben App nicht mehr als 30 Verbindungen mit Datenquellen her.Don’t connect to more than 30 data sources from the same app. Apps fordern neue Benutzer auf, sich bei jedem Connector anzumelden, daher erhöht jeder Connector die Zeitspanne, die die App zum Starten benötigt.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. Während der Ausführung einer App erfordert jeder Connector CPU-Ressourcen, Arbeitsspeicher und Netzwerkbandbreite, wenn die App Daten aus einer Quelle anfordert.As an app runs, each connector requires CPU resources, memory, and network bandwidth when the app requests data from that source.

Sie können die Leistung Ihrer App schnell messen, indem Sie während der Ausführung der App die Entwicklertools in Microsoft Edge oder Google Chrome aktivieren.You can quickly measure your app’s performance by turning on Developer Tools in Microsoft Edge or Google Chrome while running the app. Ihre app ist wahrscheinlich länger als 15 Sekunden, um Daten zurückzugeben, wenn sie häufig Daten von mehr als 30 Datenquellen, z. B. Common Data Service, Azure SQL, SharePoint und Excel auf OneDrive anfordert.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.

Beschränken der Anzahl von SteuerelementenLimit the number of controls

Fügen Sie einer App nicht mehr als 500 Steuerelemente hinzu.Don’t add more than 500 controls to the same app. PowerApps generiert ein HTML-DOM-Element für jedes Steuerelement, das gerendert werden muss.PowerApps generates an HTML DOM to render each control. Je mehr Steuerelemente Sie hinzufügen, desto mehr Zeit benötigt PowerApps zum Generieren.The more controls you add, the more generation time PowerApps needs.

Sie können in einigen Fällen das gleiche Ergebnis erzielen und für einen schnelleren App-Start sorgen, wenn Sie anstelle von einzelnen Steuerelementen einen Katalog verwenden.You can, in some cases, achieve the same result and have the app start faster if you use a gallery instead of individual controls. Darüber hinaus sollten Sie die Anzahl von Steuerelementtypen im gleichen Bildschirm reduzieren.In addition, you might want to reduce the number of control types on the same screen. Einige Steuerelemente (z.B. PDF-Viewer, Datentabellen und Kombinationsfelder) benötigen große Ausführungsskripts, und es dauert länger, sie zu rendern.Some controls (such as PDF viewer, data table, and combo box) pull in large execution scripts and take longer to render.

Optimieren der OnStart-FunktionOptimize the OnStart function

Verwenden Sie die ClearCollect-Funktion, um Daten lokal zwischenzuspeichern, wenn sie während der Benutzersitzung nicht geändert werden.Use the ClearCollect function to cache data locally if it doesn’t change during the user session. Verwenden Sie außerdem die Concurrent-Funktion, um Datenquellen gleichzeitig zu laden.Also, use the Concurrent function to load data sources simultaneously.

Wie in diesem Referenzthema veranschaulicht, können Sie Concurrent verwenden, um die Zeitspanne zu halbieren, die eine App zum Laden von Daten benötigt.As this reference topic demonstrates, you can use Concurrent to cut the amount of time an app needs to load data in half.

Ohne die Concurrent-Funktion lädt diese Formel jede der vier Tabellen einzeln: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]' )

Sie können dieses Verhalten in den Entwicklertools Ihres Browsers überprüfen:You can confirm this behavior in the Developer Tools for your browser:

ClearCollect, serielle Ausführung

Sie können diese Formel in die Concurrent-Funktion einschließen, um die gesamten Ausführungsdauer des Vorgangs zu reduzieren: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]' ))
    

Mit dieser Änderung ruft die App die Tabellen parallel ab:With this change, the app fetches the tables in parallel:

Parallele ClearCollect

Zwischenspeichern von SuchdatenCache lookup data

Verwenden Sie die Set-Funktion, um Daten aus Nachschlagetabellen lokal zwischenzuspeichern und so ein wiederholtes Abrufen von Daten aus der Quelle zu vermeiden.Use the Set function to cache data from lookup tables locally to avoid repeatedly retrieving data from the source. Diese Technik optimiert die Leistung, wenn sich die Daten während einer Sitzung voraussichtlich nicht ändern.This technique optimizes performance if the data probably won’t change during a session. Wie in diesem Beispiel werden die Daten einmal aus der Quelle abgerufen. Danach wird lokal auf die Daten verwiesen, bis der Benutzer die App schließt.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 ändern sich nicht häufig, und das Gleiche gilt für Standardwerte und Benutzerinformationen.Contact information doesn’t change frequently, and neither do default values and user information. Sie können diese Technik also im Allgemeinen auch mit den Funktionen Defaults und User verwenden.So you can generally use this technique with the Defaults and User functions also.

Vermeiden der Abhängigkeit von Steuerelementen zwischen BildschirmenAvoid controls dependency between screens

Zur Verbesserung der Leistung werden Bildschirme in einer app in den Arbeitsspeicher geladen, nur, wenn sie benötigt werden.To improve performance, the screens of an app are loaded into memory only as they are needed. Diese Optimierung kann beeinträchtigt werden, wenn Sie z. B. Bildschirm 1 geladen wird und eine der Formeln eine Eigenschaft eines Steuerelements vom Bildschirm 2 verwendet.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. Jetzt muss (Bildschirm 2) geladen werden, um die Abhängigkeit zu erfüllen, bevor der Bildschirm 1 angezeigt werden kann.Now screen 2 must be loaded to fulfill the dependency before screen 1 can be displayed. Angenommen Sie, Bildschirm 2 eine Abhängigkeit auf dem Bildschirm 3 verfügt, die hat eine andere Abhängigkeit (Bildschirm 4) und So weiter.Imagine screen 2 has a dependency on screen 3, which has another dependency on screen 4, and so on. Diese Abhängigkeitskette kann dazu führen, dass viele Bildschirme geladen werden.This dependency chain can cause many screens to be loaded.

Vermeiden Sie aus diesem Grund Formel Abhängigkeiten zwischen den Bildschirmen.For this reason avoid formula dependencies between screens. In einigen Fällen können Sie eine globale Variable oder Sammlung verwenden, um Informationen zwischen Bildschirmen freigeben.In some cases you can use a global variable or collection to share information between screens.

Es ist eine Ausnahme aus.There is an exception. Stellen Sie im vorherigen Beispiel sich vor, dass die einzige Möglichkeit, Bildschirm 1 angezeigt wird, durch die Navigation von Bildschirm 2.In the previous example imagine that the only way to display screen 1 is by navigating from screen 2. Klicken Sie dann wird (Bildschirm 2) bereits im Arbeitsspeicher geladen wurden Bildschirm 1 wurde geladen werden.Then screen 2 would have already been loaded in memory when screen 1 was to be loaded. Keine zusätzliche Arbeit erforderlich ist, um die Abhängigkeit für den Bildschirm 2 zu erfüllen, und daher besteht keine Auswirkungen auf die Leistung.No additional work is needed to fulfill the dependency for screen 2 and therefore there's no performance impact.

Verwenden der DelegierungUse delegation

Verwenden Sie nach Möglichkeit Funktionen, die die Datenverarbeitung an die Datenquelle delegieren, anstatt Daten zur Verarbeitung auf das lokale Gerät abzurufen.Where possible, use functions that delegate data processing to the data source instead of retrieving data to the local device for processing. Wenn eine App Daten lokal verarbeiten muss, benötigt dieser Vorgang wesentlich mehr Verarbeitungsleistung, Arbeitsspeicher und Netzwerkbandbreite – insbesondere bei großen Datasets.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.

Wie diese Liste zeigt, unterstützen verschiedene Datenquellen die Delegierung aus verschiedenen Funktionen:As this list shows, different data sources support delegation from different functions:

Verwenden der Delegierung

SharePoint-Listen unterstützen z.B. die Delegierung aus der Filter-Funktion, aber nicht aus der Search-Funktion.For example, SharePoint lists support delegation from the Filter function but not the Search function. Daher sollten Sie Filter anstelle von Search verwenden, um Elemente in einem Katalog zu suchen, wenn die SharePoint-Liste mehr als 500 Elemente enthält.So you should use Filter instead of Search to find items in a gallery if the SharePoint list contains more than 500 items. Weitere Tipps finden Sie unter Working with large SharePoint lists in PowerApps (Arbeiten mit großen SharePoint-Listen in PowerApps, Blogbeitrag).For more tips, see Working with large SharePoint lists in PowerApps (blog post).

Verwenden des verzögerten LadensUse Delayed Load

Aktivieren Sie das experimentelle Feature für das verzögerte Laden, wenn Ihre App über mehr als 10 Bildschirme, keine Regeln und viele Steuerelemente verfügt, die sich auf mehreren Bildschirmen befinden und direkt an die Datenquelle gebunden sind.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. Wenn Sie diese Art App erstellen und dieses Feature nicht aktivieren, könnte die App-Leistung beeinträchtigt werden, weil die Steuerelemente in allen Bildschirmen aufgefüllt werden müssen – auch in Bildschirmen, die gar nicht geöffnet sind.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. Darüber hinaus müssen alle Bildschirme der App aktualisiert werden, sobald sich die Datenquelle ändert, weil beispielsweise der Benutzer einen Datensatz hinzufügt.Also, all screens of the app must be updated whenever the data source changes, such as when the user adds a record.

Arbeiten mit großen DatasetsWorking with large data sets

Verwenden Sie Datenquellen und Formeln, die delegiert werden können, um die Leistungsfähigkeit Ihrer Apps zu sichern, dafür zu sorgen, dass Benutzer auf alle benötigten Informationen zugreifen können, und die maximale Anzahl von 2000 Datenzeilen für nicht delegierbare Abfragen nicht zu überschreiten.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. Bei Datensatzspalten, in denen Benutzer Daten suchen, filtern oder sortieren können, sollten die Indizes gemäß den Beschreibungen unter SQL Server und SharePoint entworfen werden.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.

Regelmäßiges erneutes Veröffentlichen von AppsRepublish apps regularly

Veröffentlichen Sie Ihre Apps neu, um Leistungssteigerungen zu erzielen und von weiteren Features der PowerApps-Plattform zu profitieren. Informationen dazu finden Sie im Blogbeitrag Republish your apps.Republish your apps (blog post) to get performance improvements and additional features from the PowerApps platform.

Vermeiden Sie die gleiche Formel an mehreren Orten wiederholenAvoid repeating the same formula in multiple places

Wenn mehrere Eigenschaften ausführen, die gleiche Formel (insbesondere, wenn es komplexe ist), sollten Sie Sie einmal festgelegt, und klicken Sie dann auf die Ausgabe der ersten Eigenschaft in dem alle weiteren verweisen.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. Z.B. festlegen, nicht die "DisplayMode" Eigenschaft von Steuerelementen, die auf die gleiche Formel für die komplexe A, B, C, D und E.For example, don't set the DisplayMode property of controls A, B, C, D and E to the same complex formula. Legen Sie stattdessen eine der "DisplayMode" Eigenschaftensatz auf die komplexen Formel B "DisplayMode" Eigenschaft, um das Ergebnis des A "DisplayMode" Eigenschaft, und so weiter für C, D und 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.

DelayOutput auf alle Texteingabe-Steuerelemente aktivierenEnable DelayOutput on all Text input controls

Wenn Sie mehrere Formeln oder Regeln, die den Wert von Verweisen auf eine Texteingabe steuern, legen Sie die DelayedOutput Eigenschaft dieses Steuerelements auf "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. Die Text Eigenschaft dieses Steuerelements aktualisiert werden, erst nach Tasteneingaben in schneller Folge nicht mehr gegeben.The Text property of that control will be updated only after keystrokes entered in quick succession have ceased. Die Formeln oder Regeln nicht so häufig ausgeführt, und app-Leistung wird verbessert.The formulas or rules won't run as many times, and app performance will improve.

Vermeiden Sie die Verwendung von Form.Updates in Regeln und FormelnAvoid using Form.Updates in rules and formulas

Wenn Sie eine Benutzereingabe-Wert in einer Regel oder eine Formel mit Verweisen auf eine Form.Updates Variablen, es Datenkarten des Formulars durchläuft und ein Datensatz erstellt jedes Mal.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. Um Ihre app effizienter zu gestalten, verweisen Sie den Wert direkt aus der Daten oder die Control-Wert.To make your app more efficient, reference the value directly from the data card or the control value.

Nächste SchritteNext steps

Überprüfen Sie die Codierungsstandards zum Maximieren der Leistung der app und Beibehalten von apps einfacher zu verwalten.Review the coding standards for maximizing app performance and keeping apps easier to maintain.