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 のようになります。
出力ロギングも行う失敗コンテキスト内で profile 式を使う場合、コード内の profile 式と出力呼び出しの順番に関係なく、すべてのプロファイル出力の後で出力ログに出力されます。
profile コード ブロックに defer 式が含まれる場合、defer 式もプロファイルされますが、その profile コード ブロックが終了する最後のときに実行されます。
MyFunction1():void=
defer:
MyFunction2() # code is not profiled
profile:
defer:
MyFunction3() # code is profiled and run last
MyFunction4() # code is profiled and run first結果
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) # Allowed inside profile
Sleep(0.0) # Not allowed inside profileclass メンバーの静的データ開始と一緒に profile 式を使用することはできません。 次の例は許可されません。
my_class := class:
Value:int = profile{ 1 + 2 + 3 }