Com a expressão profile, você pode instrumentar seu código para medir o desempenho. Veja a seguir a sintaxe para usar uma expressão profile em um bloco de código.
code-before
profile:
code-to-measure
code-afterNeste exemplo, slow-code representa um bloco de código cujo desempenho o usuário deseja medir. Quando o código é executado, o tempo em milissegundos entre a entrada e a saída do bloco de código profile é impresso no Registro de saída no UEFN.
Você pode encontrar a saída para o código com perfil como LogVerse: VerseProfile: 0.023900 ms. Se tiver várias expressões profile no seu código e quiser organizar a saída, você poderá adicionar uma string à sua expressão profile como tags de usuário:
profile(“User String to Categorize Output”):
code-to-measureNeste exemplo, a saída seria semelhante a LogVerse: VerseProfile: User String to Categorize Output 0.023900 ms.
Se você usar a expressão profile em um contexto de falha que também tem logs de impressão, toda a saída de profile será relatada primeiro antes das impressões no registro de saída, independentemente da ordem das expressões profile e das chamadas de impressão no código.
Se o bloco de código profile tiver uma expressão defer, a expressão defer também terá um perfil, mas será executada por último ao sair do bloco de código de 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
Tudo em Verse é uma expressão, o que significa que tem um resultado, e isso inclui a expressão profile. A expressão profile transmite os valores dos resultados da mesma maneira que as expressões if.
Neste exemplo, MyFunction retorna algum valor que é passado pela expressão profile e armazenado na variável ResultOfFunction. Isso significa que você pode facilitar a instrumentação do código em torno de chamadas de função e usar os resultados das chamadas de função fora do escopo do bloco de código profile.
ResultOfFunction := profile(“MyFunction”):
MyFunction()Dicas e práticas recomendadas
Ao trabalhar com a expressão profile, tenha em mente as seguintes dicas e práticas recomendadas:
Os tempos relatados pelas expressões
profilenão são determinísticos para um determinado trecho de código. O tempo real medido pode ou não depender de muitos fatores fora do seu controle, como o estado do jogo, o número de jogadores, a carga no hardware do servidor, a latência da rede e muito mais. É melhor criar o perfil de um trecho de código várias vezes para determinar o melhor caso, a média e o pior caso, bem como para entender quais pontos de dados são valores atípicos.A criação de perfil tem uma pequena sobrecarga, principalmente devido ao registro em log e a qualquer interpolação de string para a tag do usuário. Isso pode adicionar um pouco de tempo ao resultado da criação do perfil, então tente direcionar esse processo a áreas de interesse e mantenha suas tags de usuário simples.
* Evite aninhar expressões
profile. Funcionará, mas a sobrecarga de criação de perfil da expressãoprofileinterna será incluída no tempo da expressãoprofileexterna, o que afetará seus resultados.Remova expressões
profiledo código do jogo para envio. A geração de código de perfil não está atualmente excluída das compilações de envio e, portanto, introduzirá uma sobrecarga indesejada em qualquer código do jogo que você tenha, caso o código seja mantido.
Limitações conhecidas
A seguir estão as limitações conhecidas do uso da expressão profile.
Você pode usar a expressão profile em um contexto assíncrono, mas atualmente não pode chamar código assíncrono em um bloco de código profile. O exemplo a seguir demonstra isso.
MyAsyncFunction()<suspends>:void=
profile: # Allowed inside <suspends> function
MyRandomInt := GetRandomInt(10, 100) # Allowed inside profile
Sleep(0.0) # Not allowed inside profileVocê não pode usar a expressão profile com inicialização de dados estáticos de membros da classe. O exemplo a seguir não é permitido.
my_class := class:
Value:int = profile{ 1 + 2 + 3 }