Mit dem profile-Ausdruck kannst du deinen Code messen, um seine Performance zu messen. Im Folgenden wird die Syntax für die Verwendung eines profile-Ausdrucks in einem Codeblock beschrieben.
code-before
profile:
code-to-measure
code-afterIn diesem Beispiel stellt slow-code einen Codeblock dar, dessen Performance der Benutzer messen möchte. Wenn der Code ausgeführt wird, wird die Zeit in Millisekunden zwischen dem Betreten und dem Beenden des Codeblocks profile in das Output-Log in UEFN gedruckt.
Du findest den Output für den profilierten Code als LogVerse: VerseProfile: 0.023900 ms. Wenn du mehrere Profilausdrücke in deinem Code hast und die Ausgabe organisieren möchtest, kannst du eine Zeichenkette zu deinem Profilausdruck als Benutzer-Tags hinzufügen:
profile(“User String to Categorize Output”):
code-to-measureIn diesem Beispiel würde die Ausgabe wie folgt aussehen: LogVerse: VerseProfile: User String to Categorize Output 0.023900 ms.
Wenn du den profile-Ausdruck innnerhalb eines failure context verwendest, der auch über eine Druckprotokollierung verfügt, werden alle Profilausgaben unabhängig von der Reihenfolge der profile-Ausdrücke und Druckaufrufe im Code zuerst gemeldet, bevor die Drucke im Ausgabeprotokoll erscheinen.
Wenn der Codeblock profile einen Ausdruck defer hat, wird der Ausdruck defer auch profiliert, aber beim Verlassen des Codeblocks profile zuletzt ausgeführt.
MyFunction1():void=
defer:
MyFunction2() # code is not profiled
profile:
defer:
MyFunction3() # code is profiled and run last
MyFunction4() # code is profiled and run firstErgebnis
Alles in Verse ist ein Ausdruck, was bedeutet, dass es ein Ergebnis hat, und das schließt den profile-Ausdruck mit ein. Der profile-Ausdruck leitet Ergebniswerte auf die gleiche Weise durch wie if-Ausdrücke.
In diesem Beispiel gibt MyFunction einen Wert zurück, der durch den profile-Ausdruck übergeben und in der Variable ResultOfFunction gespeichert wird. Das bedeutet, dass du die Code-Instrumentierung um Funktionsaufrufe herum erleichtern und die Ergebnisse der Funktionsaufrufe außerhalb des Geltungsbereichs des `profile`-Codeblocks verwenden kannst.
ResultOfFunction := profile(“MyFunction”):
MyFunction()Tipps und Optimale Vorgehensweisen
Wenn du mit dem profile-Ausdruck arbeitest, beachte bitte die folgenden Tipps und optimalen Vorgehensweisen:
Die von den Ausdrücken
profilegemeldeten Zeiten sind für ein bestimmtes Codestück nicht deterministisch. Die tatsächlich gemessene Zeit kann von vielen Faktoren abhängen, auf die du keinen Einfluss hast, wie z. B. dem Status des Spiels, der Anzahl der Spieler, der Auslastung der Serverhardware, der Netzwerklatenz und vielem mehr. Am besten ist es, ein Stück Code mehrmals zu profilieren, um die besten, durchschnittlichen und schlechtesten Fälle zu ermitteln und zu verstehen, welche Datenpunkte Ausreißer sind.Das Profiling verursacht einen geringen Overhead, der hauptsächlich auf die Protokollierung und die Interpolation der Strings für das Nutzer-Tag zurückzuführen ist. Das kann etwas Zeit in Anspruch nehmen, also versuche, dein Profiling auf Gebiete zu zielen, die dich interessieren, und halte deine Benutzer-Tags einfach.
Vermeide die Verschachtelung von
profile-Ausdrücken. Es wird funktionieren, aber der Profiling-Overhead des innerenprofile-Ausdrucks wird in die Zeit des äußerenprofile-Ausdrucks einbezogen, was sich auf deine Ergebnisse auswirken wird.Entferne
profile-Ausdrücke aus deinem ausgelieferten Spielcode. Die Generierung von Profilcode ist derzeit nicht von den ausgelieferten Builds ausgeschlossen, sodass sie einen unerwünschten Overhead für jeden Code im Spiel mit sich bringt, wenn du sie im Spiel lässt.
Bekannte Einschränkungen
Nachstehend sind die bekannten Einschränkungen bei der Verwendung des Ausdrucks profile.
Du kannst den Ausdruck profile innerhalb eines asynchronen Kontextes verwenden, aber derzeit kannst du noch keinen asynchronen Code in einem profile-Codeblock aufrufen. Das folgende Beispiel verdeutlicht dies.
MyAsyncFunction()<suspends>:void=
profile: # Allowed inside <suspends> function
MyRandomInt := GetRandomInt(10, 100) # Allowed inside profile
Sleep(0.0) # Not allowed inside profileDu kannst den profile-Ausdruck nicht mit statischer Initialisierung der Daten von class-Mitgliedern verwenden. Das folgende Beispiel ist nicht erlaubt.
my_class := class:
Value:int = profile{ 1 + 2 + 3 }