profile
式を使用して、パフォーマンス測定のためのコードを挿入できます。以下は、コード ブロックで profile
式を使うための構文です。
code-before
profile:
code-to-measure
code-after
この例では、ユーザーがパフォーマンスを測定したいコード ブロックを slow-code
としています。このコードを実行すると、profile
コード ブロックの開始から終了までの時間 (ミリ秒) が UEFN の 出力ログ に出力されます。
そのコードに該当するアウトプットは LogVerse: VerseProfile: 0.023900 ms
のようにプロファイルされます。コードに複数のプロファイル式がありアウトプットを整理したい場合は、文字列をユーザー タグとしてプロファイル式に追加できます。
profile(“User String to Categorize Output”):
code-to-measure
この例のアウトプットは LogVerse: VerseProfile: User String to Categorize Output 0.023900 ms
のようになります。
Print String の出力も行う failure context (失敗コンテキスト) 内で profile
式を使う場合、コード内の profile
式と Print String 呼び出しの順番に関係なく、すべてのプロファイル出力の後で Print String が出力ログに出力されます。
profile
コード ブロックに defer
式が含まれる場合、defer
式もプロファイルされますが、その profile
コード ブロックが終了する最後のときに実行されます。
MyFunction1():void=
defer:
MyFunction2() # code is not profiled
profile:
defer:
MyFunction3() # コードがプロファイルされ、最後に実行されます
MyFunction4() # コードがプロファイルされ、最初に実行されます
結果
Verse ではすべてが式であるため、結果があります。profile
式も同様です。profile
式は if 式と同様に結果の値を渡します。
この例では profile
式が渡した値を MyFunction
が返し、ResultOfFunction
変数に格納します。関数呼び出し前後のコード挿入が簡単になり、関数呼び出しの結果をプロファイル コード ブロックの範囲外で使用できるようになります。
ResultOfFunction := profile(“MyFunction”):
MyFunction()
ヒントとベスト プラクティス
次のヒントとベスト プラクティスを基に profile
式をご使用ください。
profile
式が報告するタイミングは、コードによっては絶対ではありません。実際の測定時間は、ゲームの状態やプレイヤー数、サーバー ハードウェアへの負荷、ネットワーク レイテンシーなど、制御できない多くの要素によって変わる場合があります。ベスト、平均、ワーストのケースを決めると同時に、どのデータ ポイントが外れ値なのかを把握するため、1 つのコードを複数回プロファイルすると良いでしょう。- プロファイリングにはオーバーヘッドがありますが、これは主にロギングとユーザー タグの文字列補間によるものです。プロファイリング結果が出るまでの時間が少し長くなるおそれがあるため、プロファイリングは関心領域を対象に行い、ユーザー タグをシンプルにしましょう。
profile
式はネスティングしないでください。機能はしますが、内側のprofile
式のプロファイリング オーバーヘッドが外側のprofile
式のタイミングに含まれてしまうため、結果に影響します。profile
式はシッピング ゲーム コードから削除してください。profile コード生成はシッピング ビルドから現在取り除かれていません。そのため、残したままのインゲーム コードがあると余計なオーバーヘッドが発生します。
既知の制限事項
profile
式を使用する上での既知の制限事項を以下に説明します。
profile
式は非同期コンテキスト内で使用できますが、profile
コード ブロックで非同期コードを呼び出すことは現在できません。以下の例がそれを示しています。
MyAsyncFunction()<suspends>:void=
profile: # Allowed inside <suspends> function
MyRandomInt := GetRandomInt(10, 100) # プロファイル内で許可されます
Sleep(0.0) # プロファイル内で許可されません
class
メンバーの静的データ開始と一緒に profile
式を使用することはできません。次の例は許可されません。
my_class := class:
Value:int = profile{ 1 + 2 + 3 }