概要
Unityでスクリプトのベンチマークをとる方法はいくつかあるが、その中で自分がよく使う 3つ 4つを紹介する。
(2021/08/24 追記)
4つ目にTime.realtimeSinceStartupを紹介。
1. C#のStopwatchクラスを使う
C#にはStopwatchというクラスが用意されている。
https://docs.microsoft.com/ja-jp/dotnet/api/system.diagnostics.stopwatch?view=net-5.0
このStopwatchクラスを使うことで処理にかかった時間を手軽に計測することができる。
サンプルコードは以下の通り。
var sw = new System.Diagnostics.Stopwatch();
// 計測開始
sw.Start();
// 計測したい処理
...
// 計測終了
sw.End();
// 計測結果を出力する
System.Console.WriteLine($"処理時間:{sw.Elapsed}");
Stopwatchはその名の通りただのストップウォッチでしかないため、自分でStart~Endした時間を出力するだけである。
そのため手軽にざっくり処理時間を調べたい場合に使うと良い。
ElapsedはTimeStamp構造体のため、Millisecondsなどの細かい表示も可能。
https://docs.microsoft.com/ja-jp/dotnet/api/system.diagnostics.stopwatch.elapsed?view=net-5.0
2. Unity ProfilerのBeginSampleを使う
UnityのProfilerにはBeginSample, EndSampleというメソッドが用意されている。
https://docs.unity3d.com/ja/current/ScriptReference/Profiling.Profiler.BeginSample.html
これらのメソッドを使うことで、BeginSampleとEndSampleで挟んだ処理をProfilerで表示することができる。
サンプルコードは以下の通り。
// 計測開始
UnityEngine.Profiling.Profiler.BeginSample("test_sample");
// 計測したい処理
...
// 計測終了
UnityEngine.Profiling.Profiler.EndSample();
こちらはProfilerでの計測になるため、Stopwatchと違い処理にかかった時間だけでなく確保したメモリ量等も計測することができる。
そのためより詳細に調べたい場合に使用すると良い。
BeginSampleの引数で渡した文字列がProfilerに表示されるため、Profilerで検索しやすい名前にしておくとベター。
3. Performance Testing Extensionを使う
UnityのTestRunnerには拡張機能としてPerformance Testing Extensionが用意されている。
https://docs.unity3d.com/Packages/com.unity.test-framework.performance@2.8/manual/index.html
これはTestRunnerのテストコードの中に処理を計測するコードを書いてTestReportとして出力することができるものである。
導入方法については別記事にて記載してあるため、そちらを参照のこと。
https://qiita.com/hashikei/items/4c4be59418fcf0c4e5bd
導入後のサンプルコードは以下の通り。
using NUnit.Framework;
using Unity.PerformanceTesting;
public class TestPerformance
{
[Test, Performance]
public void TestSample()
{
Measure.Method(() => { /* 計測したい処理 */ })
.MeasurementCount(10)
.Run();
}
}
TestReportのサンプル
https://docs.unity3d.com/Packages/com.unity.test-framework.performance@2.8/manual/viewing-results.html
導入方法が少し複雑でとっつきにくいが、MeasurementCountで計測回数を指定したり、計測結果をグラフで可視化してくれたりと、わりと便利な機能である。
SampleGroupでSampleUnitを設定することで、処理時間以外の値も計測することができる。
https://docs.unity3d.com/Packages/com.unity.test-framework.performance@2.8/manual/measure-custom.html
4. UnityのTime.realtimeSinceStartupを使う
UnityのTimeクラスにはrealtimeSinceStartupというプロパティが用意されている。
https://docs.unity3d.com/ja/current/ScriptReference/Time-realtimeSinceStartup.html
このプロパティはゲーム開始からの経過時間を取得するものだが、Time.timeと違いTime.timeScaleの影響を受けないため、リアルタイムの経過時間として参照できる。
サンプルコードは以下の通り。
// 計測開始
var t = Time.realtimeSinceStartup;
// 計測したい処理
...
// 計測結果を出力する
System.Console.WriteLine($"処理時間:{Time.realtimeSinceStartup - t}");
用途としては1のStopwatchと同様だが、細かい表示が不要な場合はTime.realtimeSinceStartupの方が手軽でオススメ。