Con la expresión profile, puedes equipar tu código para medir su rendimiento. La siguiente es la sintaxis para usar una expresión profile en un bloque de código.
code-before
profile:
code-to-measure
code-afterEn este ejemplo, slow-code representa un bloque de código que el usuario quiere medir para el rendimiento. Cuando se ejecuta el código, se imprime la cantidad de tiempo en milisegundos entre la entrada y la salida del bloque de código profile en el registro de salida en UEFN.
Puedes encontrar la salida para el código perfilado como LogVerse: VerseProfile: 0.023900 ms. Si tienes múltiples expresiones de perfil en tu código y quieres organizar la salida, puedes añadir una cadena a tu expresión de perfil como una etiqueta de usuario:
profile(“User String to Categorize Output”):
code-to-measureEn este ejemplo, la salida se vería como LogVerse: VerseProfile: Cadena de usuario para categorizar la salida 0.023900 ms.
Si usas una expresión profile dentro de un contexto de fallo que también tiene registro impreso, toda salida de perfil se informa primero en las impresiones en el registro de salida, independientemente del orden de las expresiones profile y las llamadas impresas en el código.
Si el bloque de código profile tiene una expresión defer, la expresión defer también se perfilará, pero se ejecutará en último lugar al salir del bloque de código profile.
MyFunction1():void=
defer:
MyFunction2() # code is not profiled
profile:
defer:
MyFunction3() # code is profiled and run last
MyFunction4() # code is profiled and run firstResultado
Todo en Verse es una expresión, lo que significa que tiene un resultado, y esto incluye una expresión profile. La expresión profile transmite los valores de resultado de la misma manera que las expresiones if.
En este ejemplo, MyFunction devuelve algún valor que se transmite a la expresión profile y que se almacena en la variable ResultOfFunction. Esto significa que puedes facilitar la instrumentación del código alrededor de las llamadas de función y ser capaz de usar los resultados de las llamadas de función fuera del ámbito del bloque de código de perfil.
ResultOfFunction := profile(“MyFunction”):
MyFunction()Consejos y prácticas recomendadas
Cuando trabajes con la expresión profile, ten en cuenta los siguientes consejos y prácticas recomendadas:
Los tiempos informados por las expresiones
profileno son determinantes para una pieza de código dada. El tiempo medido real puede o no depender de muchos factores fuera de tu control, como el estado del juego, la cantidad de jugadores, la carga del hardware del servidor, la latencia de red y más. Es mejor perfilar de una pieza de código muchas veces para determinar los mejores y peores casos y los casos promedio, así como para entender qué puntos de información son valores atípicos.La generación de perfiles tiene una pequeña sobrecarga, principalmente por el registro y por cualquier interpolación de cadena para la etiqueta de usuario. Esto puede añadir una pequeña cantidad de tiempo a tu resultado de generación de perfiles, así que intenta dirigir tu generación de perfiles a las áreas de interés y mantén tus etiquetas de usuario simples.
Evita anidar expresiones
profile. Funcionará, pero la sobrecarga de generación de perfiles de la expresión interna deprofileestará incluida en el tiempo de la expresión externa deprofile, que afectará tus resultados.Elimina las expresiones
profilede tu código de juego de envío. La generación de un código de perfil no está actualmente excluida de las compilaciones de envío, así que introducirá una sobrecarga no deseada en cualquier código en el juego que tengas si lo mantienes dentro.
Limitaciones conocidas
Las siguientes son limitaciones conocidas por usar la expresión profile.
Puedes usar la expresión profile dentro de un contexto asíncrono, pero no puedes llamar actualmente un código asíncrono en un bloque de código profile. El siguiente ejemplo lo demuestra.
MyAsyncFunction()<suspends>:void=
profile: # Allowed inside <suspends> function
MyRandomInt := GetRandomInt(10, 100) # Allowed inside profile
Sleep(0.0) # Not allowed inside profileNo puedes usar la expresión profile con una inicialización de datos estáticos de miembros de class. El siguiente ejemplo no está permitido.
my_class := class:
Value:int = profile{ 1 + 2 + 3 }