Con l'espressione profile puoi strumentare il codice per misurarne le prestazioni. La seguente è la sintassi per utilizzare un'espressione profile in un blocco di codice.
code-before
profile:
code-to-measure
code-afterIn questo esempio, slow-code rappresenta un blocco di codice che l'utente desidera misurare per le prestazioni. Quando il codice viene eseguito, il tempo in millisecondi che intercorre tra l'entrata e l'uscita dal blocco di codice profile viene stampato nel Registro di output in UEFN.
Puoi trovare l'output del codice profilato come LogVerse: VerseProfile: 0.023900 ms. Se hai più espressioni di profilo nel tuo codice e vuoi organizzare l'output, puoi aggiungere una stringa all'espressione di profilo come tag utente:
profile(“User String to Categorize Output”):
code-to-measureIn questo esempio, l'output sarà simile a LogVerse: VerseProfile: User String to Categorize Output 0.023900 ms.
Se utilizzi l'espressione profile all'interno di un contesto di errore che dispone anche della registrazione della stampa, tutti gli output del profilo vengono riportati prima delle stampe nel Registro di output, indipendentemente dall'ordine delle espressioni profile e delle chiamate di stampa nel codice.
Se il blocco di codice profile ha un'espressione defer, anche l'espressione defer verrà profilata ma verrà eseguita per ultima all'uscita dal blocco di codice profile.
MyFunction1():void=
defer:
MyFunction2() # code is not profiled
profile:
defer:
MyFunction3() # code is profiled and run last
MyFunction4() # code is profiled and run firstRisultato
Tutto in Verse è un'espressione, il che significa che ha un risultato e ciò include l'espressione profile. L'espressione profile passa i valori dei risultati nello stesso modo delle espressioni if.
In questo esempio, MyFunction restituisce un valore che viene passato attraverso l'espressione profile e memorizzato nella variabile ResultOfFunction. Ciò significa che puoi facilitare la strumentazione del codice in relazione alle chiamate di funzione e che puoi utilizzare i risultati delle chiamate di funzione al di fuori dell'ambito del blocco di codice del profilo.
ResultOfFunction := profile(“MyFunction”):
MyFunction()Suggerimenti e buone prassi
Quando utilizzi l'espressione profile, tieni presente i seguenti suggerimenti e le buone prassi:
I tempi riportati dalle espressioni
profilenon sono deterministici per un determinato pezzo di codice. Il tempo effettivo misurato può dipendere o meno da molti fattori fuori dal tuo controllo, come lo stato del gioco, il numero di giocatori, il carico dell'hardware del server, la latenza della rete e altro ancora. È meglio profilare un pezzo di codice più volte per determinare i casi migliori, medi e peggiori e per capire quali punti dati sono valori anomali.La profilazione presenta un piccolo sovraccarico, dovuto principalmente alla registrazione e all'interpolazione delle stringhe per il tag utente. Ciò potrebbe aggiungere un po' di tempo ai risultati della profilazione, quindi cerca di indirizzare la profilazione verso le aree di interesse e di mantenere semplici i tag utente.
Evita di annidare le espressioni
profile. Funzionerà, ma il sovraccarico di profilazione dell'espressione internaprofilesarà incluso nella temporizzazione dell'espressione esternaprofileche influenzerà i risultati.Rimuovi le espressioni
profiledal codice di distribuzione del gioco. La generazione del codice del profilo non è attualmente esclusa dalle build di distribuzione, quindi introdurrà un sovraccarico indesiderato su tutto il codice di gioco presente, se lo mantieni.
Limitazioni note
Le seguenti sono limitazioni note dell'utilizzo dell'espressione profile.
Puoi utilizzare l'espressione profile all'interno di un contesto asincrono, ma attualmente non puoi chiamare codice asincrono in un blocco di codice profile. Il seguente esempio lo dimostra.
MyAsyncFunction()<suspends>:void=
profile: # Allowed inside <suspends> function
MyRandomInt := GetRandomInt(10, 100) # Allowed inside profile
Sleep(0.0) # Not allowed inside profileNon puoi utilizzare l'espressione profile con l'inizializzazione statica dei dati dei membri di class. Il seguente esempio non è permesso.
my_class := class:
Value:int = profile{ 1 + 2 + 3 }