Avec l'expression profile, vous pouvez instrumenter votre code pour en mesurer les performances. La syntaxe suivante permet d'utiliser une expression profile dans un bloc de code.
code-before
profile:
code-to-measure
code-afterDans cet exemple, slow-code représente un bloc de code dont l'utilisateur souhaite mesurer les performances. Lorsque le code s'exécute, le temps en millisecondes entre l'entrée et la sortie du bloc de code profile s'affiche dans le journal de sortie dans l'UEFN.
Vous pouvez trouver la sortie du code profilé au format LogVerse: VerseProfile: 0.023900 ms. Si vous avez plusieurs expressions profile dans votre code et que vous souhaitez organiser la sortie, vous pouvez ajouter une chaîne à votre expression profile en tant que balise d'utilisateur :
profile(“User String to Categorize Output”):
code-to-measureDans cet exemple, la sortie aurait le format LogVerse: VerseProfile: User String to Categorize Output 0.023900 ms.
Si vous utilisez l'expression profile dans un contexte d'échec qui a aussi une journalisation d'affichage, toute la sortie du profil est rapportée en premier avant les enregistrements du journal de sortie, quel que soit l'ordre des expressions profile et des appels d'affichage dans le code.
Si le bloc de code profile comporte une expression defer, l'expression defer est également profilée, mais s'exécute en dernier à la sortie du bloc de code profile.
MyFunction1():void=
defer:
MyFunction2() # code is not profiled
profile:
defer:
MyFunction3() # code is profiled and run last
MyFunction4() # code is profiled and run firstRésultat
Tout dans Verse est une expression, c'est-à-dire produit un résultat, y compris l'expression profile. L'expression profile transmet les valeurs de résultat de la même manière que les expressions if.
Dans cet exemple, MyFunction renvoie une valeur qui est transmise par l'expression profile et stockée dans la variable ResultOfFunction. Cela signifie que vous pouvez faciliter l'instrumentation du code autour des appels de fonction et utiliser les résultats des appels de fonction en dehors de l'étendue du bloc de code du profil.
ResultOfFunction := profile(“MyFunction”):
MyFunction()Conseils et pratiques recommandées
Lorsque vous travaillez avec l'expression profile, gardez à l'esprit les pratiques recommandées et conseils suivants :
Les délais rapportés par les expressions
profilene sont pas déterminants pour un extrait de code donné. Le temps réel mesuré peut ou non dépendre de nombreux facteurs indépendants de votre volonté, tels que l'état du jeu, le nombre de joueurs, la charge sur le matériel du serveur, la latence du réseau, etc. Il est préférable d'établir le profil d'un morceau de code à plusieurs reprises afin de déterminer le meilleur cas, le cas intermédiaire et le pire des cas et de comprendre quels sont les points de données aberrants.Le profilage entraîne un léger temps système, principalement dû à la journalisation et à l'interpolation de la chaîne pour la balise utilisateur. Cela pouvant rallonger le temps d'obtention de votre résultat de profilage, essayez de cibler votre profilage sur les zones d'intérêt et utilisez des balises utilisateur simples.
Évitez d'imbriquer les expressions
profile. Cela fonctionnera, mais le temps système de l'expressionprofileinterne sera inclus dans le délai de l'expressionprofileexterne, ce qui aura une incidence sur vos résultats.Supprimez les expressions
profilede votre code de jeu destiné à la distribution. La génération de code de profil n'est actuellement pas exclue des versions destinées à la distribution. Elle introduira donc un temps système indésirable sur tous vos codes de jeu si vous la conservez.
Limitations connues
Les limitations connues de l'utilisation de l'expression profile sont les suivantes.
Vous pouvez utiliser l'expression profile dans un contexte asynchrone, mais ne pouvez actuellement pas appeler du code asynchrone dans un bloc de code profile. L'exemple suivant en est la preuve.
MyAsyncFunction()<suspends>:void=
profile: # Allowed inside <suspends> function
MyRandomInt := GetRandomInt(10, 100) # Allowed inside profile
Sleep(0.0) # Not allowed inside profileVous ne pouvez pas utiliser l'expression profile avec l'initialisation de données statiques de membres de class. L'exemple suivant n'est pas autorisé.
my_class := class:
Value:int = profile{ 1 + 2 + 3 }