Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Da sich Canvas-Apps weiterentwickeln, um unterschiedliche Geschäftsanforderungen zu erfüllen, ist es entscheidend, die Leistung optimal zu halten. Die Datenverarbeitung, das Design der Benutzeroberfläche und die App-Funktionalität erfordern einen sorgfältigen Ansatz zur Codeoptimierung.
Wenn Canvas-Apps komplexer werden, können Probleme mit dem Datenabruf, der Komplexität von Formeln und der Rendering-Geschwindigkeit auftreten. Um ein Gleichgewicht zwischen starker Funktionalität und einer reaktionsschnellen Benutzeroberfläche zu finden, benötigen Sie einen systematischen Ansatz zur Codeoptimierung.
Power Fx Formeloptimierung
Funktion „With“
Die With-Funktion, wertet eine Formel für einen einzelnen Datensatz aus. Die Formel kann einen Wert berechnen und/oder Aktionen ausführen, wie das Ändern von Daten oder das Arbeiten mit einer Verbindung. Verwenden Sie With, um die Lesbarkeit komplexer Formeln durch Aufteilung in kleinere benannte Unterformeln zu verbessern. Diese benannten Werte wirken wie einfache lokale Variablen, die auf den Umfang der With beschränkt sind. Die Verwendung von With gegenüber Kontext- oder globalen Variablen wird bevorzugt, da sie in sich geschlossen und leicht verständlich ist und in jedem deklarativen Formelkontext verwendet werden kann.
Weitere Informationen über die With-Funktion.
Concurrent-Funktion
Mit der Concurrent-Funktion können mehrere Formeln, die in derselben Eigenschaft angegeben sind, gleichzeitig ausgewertet werden, wenn sie einen Konnektor oder Dataverse-Aufrufe haben. Normalerweise werden mehrere Formeln gleichzeitig ausgewertet, wenn Sie sie mit dem ; Operator (Semikolon) verketten. Mit Concurrent wertet die App alle Formeln in einer Eigenschaft gleichzeitig aus, auch nachdem der Operator ; verwendet wurde. Diese Parallelität bedeutet, dass Benutzer weniger auf Ergebnisse warten müssen. Wenn Datenaufrufe bis zum Abschluss der vorherigen Aufrufe nicht gestartet wurden, wartet die App auf die Summe aller Anforderungszeiten. Wenn die Datenaufrufe zur selben Zeit beginnen, wartet die App nur auf die längste Anforderungszeit.
Weitere Informationen über die Concurrent-Funktion.
Concurrent(
ClearCollect(colAccounts1, Accounts),
ClearCollect(colUsers1, Users),
ClearCollect(colEnvDef1, 'Environment Variable Definitions'),
ClearCollect(colEnvVal1, 'Environment Variable Values')
);
Coalesce-Funktion
Die Coalesce-Funktion wertet ihre Argumente der Reihe nach aus und gibt den ersten Wert zurück, der nicht leer oder eine leere Zeichenfolge ist. Verwenden Sie diese Funktion, um einen leeren Wert oder eine leere Zeichenfolge mit einem anderen Wert zu ersetzen, aber nicht leere Werte und Zeichenfolgen unverändert zu lassen. Sind alle Argumente leer oder hat es leere Zeichenfolgen, gibt die Funktion leer zurück.
Coalesce ist eine gute Möglichkeit, leere Zeichenfolgen in leere Werte zu konvertieren.
Zum Beispiel:
If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)
Erfordert, dass Wert 1 und Wert 2 zweimal ausgewertet werden. Diese Funktion kann reduziert werden auf:
Coalesce(value1, value2)
IsMatch-Funktion
Die IsMatch-Funktion prüft, ob eine Textzeichenfolge mit einem Muster übereinstimmt, das normale Zeichen, vordefinierte Muster oder einen regulären Ausdruck enthält.
Weitere Informationen über die IsMatch-Funktion.
Diese Formel entspricht beispielsweise einer US-amerikanischen Sozialversicherungsnummer:
IsMatch(TextInput1.Text, "\d{3}-\d{2}-\d{4}")
Erklärung des regulären Ausdrucks:
\\d entspricht einer Ziffer (0 bis 9).
{3} Gibt an, dass das vorangehende Ziffernmuster (\d) genau dreimal vorkommen soll.
- entspricht dem Bindestrichzeichen.
{2} Gibt an, dass das vorangehende Ziffernmuster (\d) genau zwei Mal vorkommen soll.
{4} Gibt an, dass das vorangehende Ziffernmuster (\d) genau viermal vorkommen soll.
Weitere Beispiele für IsMatch:
IsMatch(TextInput1.Text, "Hello World")
IsMatch(TextInput1\_2.Text, "(?!^\[0-9\]\\\*$)(?!^\[a-zA-Z\]\\\*$)(\[a-zA-Z0-9\]{8,10})")
App-OnStart optimieren
Die OnStart-Eigenschaft für Canvas-Apps spielt eine entscheidende Rolle bei der Festlegung der Aktionen, die beim Starten der App auftreten. Mit dieser Eigenschaft können App-Entwickler globale Initialisierungsaufgaben ausführen, Variablen einrichten und Aktionen durchführen, die während des Startvorgangs der App nur einmal erfolgen sollten. Das Verständnis und die effektive Nutzung der OnStart Eigenschaft ist für die Erstellung reaktionsschneller und effizienter Canvas-Apps unerlässlich.
Ein empfohlener Ansatz besteht darin, die App.OnStart-Funktion zu optimieren, indem Variableneinrichtungen in benannte Formeln migriert werden. Benannte Formeln, insbesondere solche, die früh im App-Lebenszyklus konfiguriert werden, erweisen sich als vorteilhaft. Diese Formeln handhaben die Initialisierung von Variablen basierend auf Datenaufrufen und sorgen für eine sauberere und besser organisierte Struktur für Ihren Code. Weitere Details Erstellen Sie große und komplexe Canvas-Apps - Power Apps | Microsoft Learn.
Anmerkung
Die OnStart Eigenschaft ist Imperative. Es handelt sich um eine geordnete Liste von Arbeiten, die erledigt werden müssen, bevor der erste Bildschirm angezeigt wird. Da es dabei ganz spezifisch nicht nur darum geht,was getan werden muss, sondern auch,wann diese Arbeit in einer bestimmten Reihenfolge erledigt werden muss, werden die Umsortierungen und Aufschübe von Optimierungen, die andernfalls durchgeführt werden könnten, eingeschränkt.
Startbildschirm
Wenn App.OnStart einen Navigate Funktionsaufruf enthält, selbst wenn es sich um eine If Funktion handelt und selben aufgerufen wird, müssen wir die Ausführung der App vollständig abschliessen.
OnStart bevor wir den ersten Bildschirm der App zeigen.
App.StartScreenist die neue deklarative Möglichkeit, anzugeben, welcher Bildschirm zuerst angezeigt werden soll, ohne Optimierungen zu blockieren.
Durch Festlegen der StartScreen-Eigenschaft wird der erste Bildschirm angezeigt, bevor App.OnStart abgeschlossen wird.
App.StartScreen declares welches Bildschirmobjekt zuerst angezeigt werden soll, ohne dass eine Vorverarbeitung erforderlich ist.
Anstatt Code wie diesen zu schreiben:
App.OnStart = Collect(OrdersCache, Orders);
If(Param("AdminMode") = "1", Navigate(AdminScreen), Navigate(HomeScreen))
Ändert den Code auf:
App.OnStart = Collect(OrdersCache, Orders);
App.StartScreen = If(Param("AdminMode") = "1", AdminScreen, HomeScreen)
Weitere Einzelheiten finden Sie unter <https://Power Apps.microsoft.com/en-us/blog/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart>.
Warnung
Vermeiden Sie Abhängigkeiten zwischen StartScreen und OnStart. Der Verweis auf eine benannte Formel, die wiederum auf eine globale Variable verweist, kann zu einer Racebedingung führen, die StartScreen nicht ordnungsgemäß angewendet wird.
Hinweis: Wir sollten keine Abhängigkeiten zwischen StartScreen und OnStart haben. Wir blockieren das Verweisen auf globale Variablen in StartScreen, aber wir können auf eine benannte Formel verweisen, die wiederum auf eine globale Variable verweist, was zu einer Racebedingung führen kann, in der StartScreen nicht ordnungsgemäß angewendet wird.
Benannte Formeln
Benannte Formeln sind statisch oder Konstanten, die im Abschnitt „App.Formulas“ definiert werden können. Sobald sie in App.Formulas deklariert sind, können sie überall in der App verwendet werden und ihr Wert bleibt immer auf dem neuesten Stand. Benannte Formeln in Power Apps ermöglichen die Festlegung von Werten oder Wertesätzen, die automatisch von der Plattform verwaltet und aktualisiert werden. Diese Funktionalität überträgt die Verantwortung für die Wertberechnung und -pflege von der Entwicklungsfachkraft auf Power Apps und rationalisiert so den Entwicklungsprozess. Benannte Formeln in Power Apps sind eine leistungsstarke Funktion, die die Leistung und Wartbarkeit von Apps erheblich verbessern kann.
Benannte Formeln können auch das Deklarieren von App-Themen ansprechen. Bei der Erstellung von Unternehmens-Apps möchten wir häufig, dass die App gemeinsame Themen aufweist, um ein einheitliches Erscheinungsbild und Benutzererlebnis zu gewährleisten. Zum Erstellen eines Themas müssen Zehner und Hunderter von Variablen beim App.OnStart deklariert werden. Dies erhöhte die Codelänge und die Initialisierungszeit der App.
Moderne Steuerelemente können auch bei der Themengestaltung erheblich hilfreich sein und dazu beitragen, die vom Kunden geschriebene Logik zur Handhabung der Themen zu reduzieren. Moderne Steuerelemente befinden sich derzeit in der Vorschau.
Beispielsweise kann der folgende Code auf App.OnStart zu App.Formulas verschoben werden, wodurch die Startzeit bei der Deklaration globaler Variablen reduziert wird.
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");
Der Code kann wie folgt nach App.Formulas verschoben werden:
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";
Ein weiteres Beispiel ist die Einstellung von Lookups. Hier ist eine Änderung in einer Suchformel erforderlich, um die Benutzerinformationen aus Office 365 statt aus Dataverse abzurufen. Die Änderung ist nur an einer Stelle erforderlich, ohne dass der Code überall geändert werden muss.
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');
Diese Formeln verkörpern die Essenz der Berechnung. Sie formulieren den Prozess zur Bestimmung von UserEmail, UserInfo, UserTitle und UserPhone basierend auf anderen Werten. Diese Logik ist gekapselt, was eine umfassende Nutzung in der gesamten App ermöglicht und an einer einzigen Stelle geändert werden kann. Die Anpassungsfähigkeit erstreckt sich auf den Wechsel von der Dataverse Benutzertabelle zum Office 365 Connector, ohne dass Änderungen an in der App verstreuten Formeln erforderlich sind.
Ein anderer Ansatz ist die Optimierung von countRows.
varListItems = CountRows(SampleList)
Mit der Set Funktion muss die Variable varListItems mit der anfänglichen Zeilenanzahl in der Beispielliste initialisiert und nach dem Hinzufügen oder Entfernen der Listenelemente erneut festgelegt werden. Bei benannten Formeln werden die varListitems-Variablen automatisch aktualisiert, wenn sich die Daten ändern.
Benannte Formeln in der App.Formulas-Eigenschaft ermöglichen einen flexibleren und deklarativeren Ansatz zur Verwaltung von Werten und Berechnungen in der gesamten App. Sie bieten Vorteile in Bezug auf zeitliche Unabhängigkeit, automatische Aktualisierungen, Wartbarkeit und unveränderliche Definitionen, anstatt sich ausschließlich auf App.OnStart zu verlassen.
| Aspekt | Benannte Formeln (App.Formulas) | App.OnStart |
|---|---|---|
| Zeitliche Unabhängigkeit | Formeln sind sofort verfügbar und können in beliebiger Reihenfolge berechnet werden. | Variablen können zeitliche Abhängigkeiten mit sich bringen, die sich auf die Verfügbarkeit auswirken. |
| Automatische Updates | Formeln werden automatisch aktualisiert, wenn sich die Abhängigkeiten ändern. | Variablen werden einmal beim Start festgelegt. Möglicherweise sind manuelle Aktualisierungen erforderlich. |
| Verwaltbarkeit | Zentralisierte Formeln an einem Ort verbessern die Wartbarkeit. | Verstreute Variablen müssen möglicherweise an mehreren Stellen gesucht und aktualisiert werden. |
| Unveränderliche Definitionen | Formeldefinitionen in App.Formulas sind unveränderlich. | Variablenwerte können versehentlich geändert werden. |
Benutzerdefinierte Funktionen
Mit benutzerdefinierten Funktionen in Power Apps Authoring Studio können Benutzer ihre eigene benutzerdefinierte Funktion erstellen.
Um diese Funktion zu verwenden, aktivieren Sie unter Vorschaueinstellungen die Option benutzerdefinierte Funktionen (UDFs). Die Vorschaufunktion sollte in der Produktion nicht verwendet werden, weshalb sie standardmäßig deaktiviert ist, aber bald allgemein verfügbar sein wird.
Definieren Sie eine Formel unter App.Formulas wie folgt:
FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula
Der Code funktioniert folgendermaßen:
FunctionNamewird verwendet, um die Funktion aufzurufenParameterist der Name der Eingabe. Eine oder mehrere Eingaben sind zulässigDataTypeist ein Argument, das an die Funktion übergeben wird, und muss diesem Datentyp entsprechen. Zu den verfügbaren Datentypen gehören boolesch, Farbe, Datum, DateTime, Dynamic, GUID, Hyperlink, Text und UhrzeitOutputDataTypeist der Datentyp, in dem die Ausgabe der Funktion erfolgen wirdFormulaist die Ausgabe der Funktion
// Function to calculate the area of a circle based on the radius
calcAreaOfCircle(radius: Number): Number =
IfError(Pi() * radius * radius, 0);
Verwenden Sie IfError, um in der festgelegten Funktion zu implementieren, wie mit Fehlern umgegangen wird.
Rufen Sie die definierte Funktion vom Text-/Beschriftungssteuerelement aus auf.
calcAreaOfCircle(Int(*TextInput1*.Text))
Anmerkung
Dies ist ein experimentelles Feature, das noch überarbeitet werden kann. Einige Datentypen, wie Datensätze und Filter, werden noch nicht unterstützt.
Optimieren Sie Variablen
Variablen definieren und legen lokale und globale Werte fest, die Sie in Ihrer gesamten App verwenden. Sie sind zwar praktisch, können aber die Effizienz Ihrer App beeinträchtigen, wenn Sie zu viele Variablen verwenden.
Im folgenden Beispiel wird veranschaulicht, wie für jedes Attribut eines Objekts eine Variable festgelegt wird, die für jede Eigenschaft Set verwendet werden müssen.
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);
Ein effizienterer Ansatz besteht darin, die Eigenschaft nur dann zu verwenden, wenn Sie sie benötigen:
Set(varEmployee, Office365Users.MyProfile())
"Welcome " & varEmployee.DisplayName
Verwenden Sie Kontextvariablen und globale Variablen mit Bedacht. Wenn der Umfang einer Variablen über einen einzelnen Bildschirm hinausgeht, verwenden Sie globale Variablen anstelle von Kontextvariablen.
Zu viele ungenutzte Variablen erhöhen die Speicherauslastung und können die App-Initialisierung verlangsamen. Für diese Variablen werden Ressourcen zugewiesen, auch wenn Sie sie nicht verwenden. Ungenutzte Variablen erhöhen auch die Komplexität der Logik Ihrer App. Auch wenn die Auswirkungen möglicherweise nicht schwerwiegend sind, empfiehlt es sich, Ihre Power App sauber und organisiert zu halten, um eine bessere Leistung und eine einfachere Entwicklung zu erzielen.
Sammlungen optimieren
Sammlungen sind temporäre Datenspeicherstrukturen, die Sie zum Speichern und Bearbeiten von Daten in einer Power Apps App verwenden. Sammlungen können jedoch zu Leistungseinbußen führen, wenn Sie sie zu häufig verwenden. Schränken Sie die Verwendung von Sammlungen ein und verwenden Sie sie nur bei Bedarf.
// Use this pattern
ClearCollect(colErrors, {Text: gblErrorText, Code: gblErrorCode});
// Do not use this pattern
Clear(colErrors);
Collect(colErrors, {Text: gblErrorText, Code: gblErrorCode});
Um Datensätze in einer lokalen Sammlung zu zählen, verwenden Sie CountIf anstelle von Count(Filter()).
Beachten Sie diese Hinweise beim Arbeiten mit Sammlungen:
Begrenzen Sie die Größe und Anzahl der Sammlungen. Da Sammlungen in der App lokal sind, werden sie im Speicher des mobilen Geräts gespeichert. Je mehr Daten die Sammlungen enthalten oder je mehr Sammlungen Sie verwenden, desto schlechter ist die Leistung. Verwenden Sie die ShowColumns Funktion, um nur bestimmte Spalten abzurufen. Fügen Sie die Filter Funktion hinzu, um nur relevante Daten abzurufen.
Die folgende Beispielfunktion gibt den gesamten Datensatz zurück.
ClearCollect(colDemoAccount, Accounts);
Vergleichen Sie dies mit dem folgenden Code, der nur bestimmte Datensätze und Spalten zurückgibt:
ClearCollect(colAcc,
ShowColumns(
Filter(Accounts, !IsBlank('Address 1: City')),
"name","address1_city"))
Dieses Beispiel gibt den folgenden Datensatz zurück:
Legen Sie eine Aktualisierungshäufigkeit für die Datenquelle fest. Wenn Sie der Sammlung neue Datensätze hinzufügen, aktualisieren Sie sie, oder sammeln Sie sie, um die neuen oder geänderten Datensätze abzurufen. Wenn mehrere Benutzer Ihre Datenquelle aktualisieren, aktualisieren Sie die Sammlung, um die neuen oder geänderten Datensätze abzurufen. Mehr Aktualisierungsaufrufe bedeuten mehr Interaktion mit dem Server.
Zwischenspeichern von Daten in Sammlungen und Variablen
Eine Sammlung ist eine Tabellenvariable, die Datenzeilen und -spalten speichert, nicht nur ein einzelnes Datenelement. Sammlungen sind aus zwei Hauptgründen nützlich: zum Aggregieren von Daten, bevor sie an die Datenquelle gesendet werden, und zum Zwischenspeichern von Informationen, um häufige Abfragen zu vermeiden. Da Sammlungen der tabellarischen Struktur der Datenquelle Power Apps entsprechen, können Sie mit ihnen effizient mit Daten interagieren, auch wenn Sie offline sind.
// Clear the contents of EmployeeCollection, it already contains data
ClearCollect(
colEmployee,
{
Id: "1",
Name: "John",
Department: "IT"
},
{
Id: "2",
Name: "Nestor",
Department: "IT"
}
)
Entfernen Sie nicht verwendete Variablen und Medien
Auch wenn ungenutzte Medien und Variablen möglicherweise keine signifikanten Auswirkungen auf die App-Leistung haben, ist es wichtig, Ihre App zu bereinigen, indem Sie alle nicht verwendeten Medien oder Variablen entfernen.
Ungenutzte Mediendateien erhöhen die App-Größe, was die Ladezeiten der App verlangsamen kann.
Nicht verwendete Variablen erhöhen die Speicherauslastung und können die App-Initialisierung leicht verlangsamen. Für diese Variablen werden Ressourcen zugeordnet, auch wenn sie nicht verwendet werden. Zu viele ungenutzte Variablen können auch die Logik der App komplexer machen.
Verwenden Sie den App Checker, um nicht verwendete Medien und Variablen zu überprüfen.
Bildschirme und Steuerelemente optimieren
Vermeiden Sie Querverweise auf Steuerelemente
Steuerelemente, die auf Steuerelemente auf anderen Bildschirmen verweisen, können das Laden und die Navigation in der App verlangsamen. Dadurch kann die App gezwungen werden, die anderen Bildschirme sofort zu laden, anstatt zu warten, bis der Benutzer zu diesem Bildschirm wechselt. Um dieses Problem zu beheben, verwenden Sie Variablen, Sammlungen und Navigationskontext, um den Zustand stattdessen bildschirmübergreifend freizugeben.
Der App-Checker in Power Apps Studio zeigt Steuerelemente an, die durch Querverweise referenziert werden. Überprüfen Sie die App-Überprüfung regelmäßig, um dieses Problem zu beheben.
Hier ist ein Beispiel für Steuerelemente mit Querverweisen. In der folgenden Abbildung ist das Steuerelement Gallery 1 im Bildschirm 2, im Steuerelement Beschriftung 2 mit einem Querverweis versehen.
Wenn Sie auf ein Steuerelement vom ersten Bildschirm in der App auf dem zweiten Bildschirm verweisen, kommt es zu keinen Leistungseinbußen, da der erste Bildschirm bereits geladen ist. Dies kann sogar eine gute Sache sein, da die App deklarativ ist, anstatt Variablen zu verwenden.
Wenn Sie auf Steuerelemente verweisen, die noch nicht geladen sind, z. B. wenn der erste Bildschirm auf ein Steuerelement verweist, das im Bildschirm 3 Label 3 genannt wird, lädt die App diesen Bildschirm in den Speicher.
DelayOutput für Textsteuerelemente aktivieren
Die DelayOutput-Einstellung registriert die Benutzereingabe mit einer Verzögerung von einer halben Sekunde, wenn auf „true“ festgelegt Dies ist nützlich für die Verzögerung von teuren Vorgängen, bis der Benutzer die Texteingabe abschließt, d.h. für die Filterung, wenn die Eingabe in anderen Formeln verwendet wird.
Beispielsweise für einen Katalog, dessen Elemente in Abhängigkeit von der Eingabe des Benutzers in das TextInput-Steuerelement gefiltert werden:
Wenn DelayOutput auf false festgelegt ist, was die Standardeinstellung ist, wird der Katalog gefiltert, sobald Text eingegeben wird. Wenn Sie über einen Katalog mit vielen Elementen verfügen, wird die Leistung verlangsamt, wenn Sie den Katalog mit Änderungen sofort neu laden. Es ist besser, ein wenig zu warten. Dies ist praktisch, wenn Sie TextInput für einen Suchstring verwenden (siehe Suchen oder Neustart mit Funktionen).
Wenn DelayOutput auf true festgelegt ist, gibt es eine kurze Verzögerung, bevor die Änderungen erkannt werden. So haben Sie Zeit, die Eingabe zu beenden. Die Verzögerung funktioniert gut mit der TextInput.OnChange-Eigenschaft. Wenn Sie Aktionen haben, die an Änderungen gebunden sind, möchten Sie nicht, dass diese ausgelöst werden, bis Sie mit der Eingabe in das Feld fertig sind.
Delegation und serverseitige Verarbeitung
Delegation
Die Delegation in Power Apps ist ein Konzept, das sich auf die Fähigkeit der App bezieht, bestimmte Vorgänge an die zugrunde liegende Datenquelle auszulagern, anstatt sie in Power Apps selbst zu verarbeiten. Durch die Verwendung der Delegation in Power Apps können Entwickler effizientere und skalierbarere Anwendungen erstellen, die selbst in Szenarien mit großen Datensätzen eine gute Leistung erbringen. Es ist wichtig, sich der Delegationsbeschränkungen für bestimmte Datenquellen und Vorgänge bewusst zu sein und Apps entsprechend zu entwerfen, um eine optimale Leistung zu erzielen.
![HINWEIS] Nicht alle Funktionen sind delegierbar. Weitere Informationen zur Delegation finden Sie unter Delegation verstehen.
Die Delegation bietet mehrere Vorteile, beispielsweise die Abfrageoptimierung, und unterstützt zusätzlich große Datensätze. Wenn sich die Quelldaten häufig ändern, hilft die Delegation außerdem dabei, die Daten auf dem neuesten Stand zu halten.
Reduzieren Sie die API-Aufrufe an die Datenquelle
Manchmal kann es praktisch erscheinen, Sammlungen zu erstellen, indem Sie Verknüpfungen innerhalb Ihrer Canvas-App durchführen. Im Folgenden finden Sie ein Beispiel:
In diesem Beispiel gibt es zwei Tabellen: Fahrer und LKWs. Der Code erstellt eine Sammlung von Fahrer- und Lkw-Details und ruft für jeden Lkw den Fahrer an, dem der Lkw gehört.
// 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)));
Das Ausführen einer solchen Verknüpfung in der Canvas-App kann viele Aufrufe an die Datenquelle verursachen, was zu langsamen Ladezeiten führt.
Ein besserer Ansatz ist:
// 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'
)
)
Im Echtzeitszenario können Sie die Ladezeiten von fünf Minuten auf unter 10 Sekunden reduzieren, indem Sie die Daten an der Quelle fixieren.
Serverseitige Verarbeitung
Mit verschiedenen Datenquellen, z. B. SQL und Dataverse, können Sie die Datenverarbeitung (z. B. Filter und Suchvorgänge) an die Datenquelle delegieren. In SQL Server können Sie Ansichten erstellen, die durch eine Abfrage definiert werden. In Dataverse können Sie Low-Code-Plug-Ins erstellen, um Daten auf dem Server zu verarbeiten und nur die Endergebnisse an Ihre Canvas-App zurückzugeben.
Das Delegieren der Datenverarbeitung an den Server kann die Leistung verbessern, den clientseitigen Code reduzieren und die Wartung Ihrer App vereinfachen.
Weitere Informationen zu Plug-Ins in Dataverse.
Abfragedatenmuster optimieren
Die explizite Spaltenauswahl verwenden
Die Funktion Explizite Spaltenauswahl (ECS) ist standardmäßig für alle neuen Apps aktiviert. Wenn es für Ihre App nicht aktiviert ist, aktivieren Sie es. ECS reduziert automatisch die Anzahl der abgerufenen Spalten auf die in der App verwendeten Spalten. Wenn ECS nicht aktiviert ist, erhalten Sie möglicherweise mehr Daten als Sie benötigen, was sich auf die Leistung auswirken kann. Manchmal, wenn eine App Daten über Sammlungen abruft, kann die ursprüngliche Quelle einer Spalte verloren gehen. ECS verwirft Spalten, wenn nicht erkannt werden kann, dass sie verwendet werden. Um zu erzwingen, dass ECS eine fehlende Spalte beibehält, verwenden Sie den PowerFx-Ausdruck ShowColumns nach einer Sammlungsreferenz oder in einem Steuerelement.
Power Automate nicht zum Befüllen einer Sammlung aufrufen
Eine gängige Vorgehensweise besteht darin, Power Automate zu verwenden, um Sammlungen abzurufen und in Power Apps zu befüllen. Dieser Ansatz ist zwar gültig, es gibt jedoch Situationen, in denen er möglicherweise nicht die effizienteste Wahl ist. Beim Aufrufen von Power Automate kommt es zu einer Netzwerklatenz und es entsteht eine weitere Leistungseinbuße von 0,6 Sekunden für die Instanziierung des Power Automate-Flows.
Eine übermäßige Nutzung von Power Automate Flows kann auch zu Ausführungsbeschränkungen und Drosselung führen. Wägen Sie daher immer die Kompromisse zwischen Netzwerklatenz und Leistungskosten ab.
Beseitigen Sie das N+1-Problem
Das N+1-Problem ist ein häufiges Problem bei Datenbankabfragen. Anstatt alle erforderlichen Daten in einer einzigen Abfrage abzurufen, werden mehrere zusätzliche Abfragen durchgeführt, um verwandte Daten abzurufen. Dies kann zu Leistungsproblemen führen, da jede zusätzliche Abfrage einen Mehraufwand verursacht.
Ein einfacher Aufruf wie dieser zum Laden einer Sammlung kann N+1 Aufrufe an die Datenquelle generieren.
ClearCollect(MyCollection, OrdersList,
{
LookUp(CustomersList,CustomerID = OrdersList[@CustomerID])
}
)
Im Kontext von Canvas-Apps und -Galerien kann das N+1-Problem auftreten, wenn mit Datenquellen und Galerien gearbeitet wird, die verwandte Datensätze anzeigen. Das Problem tritt normalerweise auf, wenn für jedes in der Galerie angezeigte Element mehrere Abfragen durchgeführt werden, was zu einem Leistungsengpass führt.
Verwenden Sie Ansichtsobjekte in SQL Server, um das N+1-Abfrageproblem zu vermeiden, oder ändern Sie die Benutzeroberfläche, um das Auslösen des N+1-Szenarios zu vermeiden.
Dataverse ruft automatisch die erforderlichen Daten der verknüpften Tabellen ab und Sie können die Spalten aus den verknüpften Tabellen auswählen.
ThisItem.Account.'Account Name'
Wenn RelatedDataSource klein ist (<<500 Datensätze), können Sie sie in einer Sammlung zwischenspeichern und die Sammlung verwenden, um das Abfrageszenario für die Suche (n + 1) auszuführen.
Begrenzung der Paketgröße
Obwohl Power Apps viel dazu beiträgt, das Laden von Apps optimiert wird, können Sie noch einiges tun, um den Speicherbedarf Ihrer Apps zu reduzieren. Ein reduzierter Platzbedarf ist insbesondere für Benutzer älterer Geräte oder Benutzer an Orten mit höherer Latenz oder reduzierter Bandbreite wichtig.
Bewerten Sie die in Ihre App eingebetteten Medien. Wenn etwas nicht verwendet wird, löschen Sie es.
Eingebettete Bilder sind möglicherweise zu groß. Prüfen Sie, ob Sie anstelle von PNG-Dateien SVG-Bilder verwenden können. Seien Sie jedoch vorsichtig bei der Verwendung von Text in SVG-Bildern, da die verwendete Schriftart auf dem Client installiert sein muss. Wenn Sie Text anzeigen müssen, bietet es sich an, eine Textbeschriftung über ein Bild zu legen.
Bewerten Sie, ob die Auflösung für den Formfaktor geeignet ist. Die Auflösung einer mobilen App muss nicht so hoch sein wie die Auflösung einer Desktop-App. Experimentieren Sie, um das richtige Gleichgewicht zwischen Bildqualität und -größe zu finden.
Wenn Sie ungenutzte Bildschirme haben, löschen Sie diese. Achten Sie darauf, keine versteckten Bildschirme zu löschen, die nur von App-Entwicklern oder Administratoren verwendet werden.
Überlegen Sie, ob Sie versuchen, zu viele Arbeitsabläufe in einer App unterzubringen. Haben Sie beispielsweise sowohl Administrator- als auch Client-Bildschirme in derselben App? Wenn ja, sollten Sie sie in einzelne Apps aufteilen. Dieser Ansatz erleichtert außerdem die gleichzeitige Arbeit mehrerer Personen an den Apps und begrenzt den „Explosionsradius“ (Umfang der Tests), wenn für App-Änderungen ein vollständiger Testdurchlauf erforderlich ist.
ForAll optimieren
Die ForAll-Funktion in Power Apps wird verwendet, um eine Datensatztabelle zu durchlaufen und auf jeden Datensatz eine Formel oder einen Satz von Formeln anzuwenden. Obwohl die Funktion selbst vielseitig ist, kann eine unsachgemäße Verwendung der ForAll-Funktion schnell die Leistung Ihrer App beeinträchtigen.
Die ForAll-Funktion ist eine sequenzielle Einzelfunktion und keine gleichzeitige Funktion. Daher wird immer nur ein Datensatz auf einmal betrachtet, das Ergebnis abgerufen und dann mit dem nächsten fortgefahren, bis alle Datensätze in seinem Bereich durchgegangen sind.
Verschachteln Sie ForAll auf keinen Fall. Dies kann zu exponenziellen Iterationen führen und die Leistung erheblich beeinträchtigen.
ClearCollect(FollowUpMeetingAttendees.ForAll(ForAll(Distinct(AttendeesList.EmailAddress.Address).Lookup(Attendees))))
Batchaktualisierungen in die Datenbank
ForAll + Patch kann ein Ansatz zum Batch-Update der Datenbank sein. Seien Sie jedoch bei der Verwendung der Reihenfolge von ForAll und Patch vorsichtig.
Folgende Funktion:
Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
{
demoName:"fromCanvas2"
})
);
Schneidet besser ab als:
ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
{
demoName:"test"
})
);