Con la expresión profile, puedes instruir tu código para medir el rendimiento. A continuación se muestra la sintaxis para utilizar 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 cuyo rendimiento desea medir el usuario. Cuando se ejecuta el código, la cantidad de tiempo en milisegundos entre la entrada y la salida del bloque de código profile se imprime en el registro de salida en UEFN.
Puedes encontrar la salida para el código con `profile` como LogVerse: VerseProfile: 0.023900 ms. Si tienes varias expresiones `profile` en tu código y quieres organizar la salida, puedes añadir una cadena a tu expresión `profile` como etiquetas de usuario:
profile(“User String to Categorize Output”):
code-to-measureEn este ejemplo, la salida se denominaría LogVerse: VerseProfile: User String to Categorize Output 0.023900 ms.
Si utilizas la expresión profile dentro de un contexto de fallo, que también tiene registro de impresión, toda la salida del `profile` se registra primero antes de las impresiones en el registro de salida, independientemente del orden de las expresiones profile y las llamadas de impresión en el código.
Si el bloque de código profile tiene una expresión defer, la expresión defer también se incluirá en el `profile` 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, lo cual incluye la expresión profile. La expresión profile pasa los valores resultantes del mismo modo que las expresiones if.
En este ejemplo, MyFunction devuelve algún valor que se pasa a través de la expresión profile y se almacena en la variable ResultOfFunction. Esto significa que puede facilitar la instrucción del código en torno a las llamadas a funciones y poder utilizar los resultados de las llamadas a funciones fuera del ámbito del bloque de código del 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 indicados por las expresiones
profileno son deterministas con respecto a un fragmento de código dado. El tiempo real medido puede depender o no de muchos factores que escapan a tu control, como el estado del juego, el número de jugadores, la carga del hardware del servidor, la latencia de la red, etc. Lo mejor es aplicar profile a un fragmento de código varias veces para determinar los casos mejor, medio y peor, así como para comprender qué puntos de datos son atípicos.El uso de la expresión `profile` tiene una pequeña sobrecarga, debida principalmente al registro y a cualquier interpolación de cadenas para la etiqueta de usuario. Esto puede añadir una pequeña cantidad de tiempo al resultado de tu profile, así que intenta dirigir tu profile a zonas de interés y crea etiquetas de usuario simples.
Evita anidar expresiones
profile. Funcionará, pero la sobrecarga de trabajo de la expresiónprofileinterna se incluirá en el tiempo de la expresiónprofileexterna, lo que afectará a los resultados.Elimina las expresiones
profilede tu código de juego de envío. La generación de código de profile no se excluye actualmente de las compilaciones de envío, por lo que introducirá una sobrecarga no deseada en cualquier código del juego que tengas si lo mantienes.
Limitaciones conocidas
A continuación se muestran limitaciones conocidas del uso de la expresión profile.
Se puede utilizar la expresión profile dentro de un contexto asíncrono, pero actualmente no se puede llamar a 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 se puede utilizar la expresión profile con la inicialización estática de datos de los miembros de class. El siguiente ejemplo no está permitido.
my_class := class:
Value:int = profile{ 1 + 2 + 3 }