Unityで実行速度を測る
Performance Testing Extensionを使うとUnityで実行速度を計測できます。
インポートする
UnityのPackageMangerを開き、左上の+ボタンから「Add package from git URL…」を選択します。そこで「com.unity.test-framework.performance」を入力するとパッケージを追加できます。
テストコードを書く
まずはテストアセンブリを作成します。Projectビューで右クリックし、Create>Testing>Tests Assembly Folderで作成できます。
それからAssemblyDefinitionReferencesに「Unity.PerformanceTesting」を追加すると使えるようになります。
テストメソッドにPerformance属性を付けると計測用の機能が使えるようになります。
以下のコードのようにMeasure.Methodに計測したい処理を渡して実行速度を計測できます。
public class PerformanceTest { [Test] [Performance] public void Test() { Measure.Method(() => { Debug.Log("計測対象"); }) .WarmupCount(10) // ウォームアップとして計測する回数 .MeasurementCount(100) // 計測する回数 .IterationsPerMeasurement(100) // 1回の計測で計測対象を実行する回数 .SetUp(() => { }) // 計測対象の実行直前に毎回実行される .CleanUp(() => { }) // 計測対象の実行直後に毎回実行される .Run(); } }
このテストをTestRunnerで実行すると計測できます。計測結果はWindow>Analysis>Performance Test Reportで見られます。
実機で実行する
PlayModeテストなら実機上でも計測できます。TestRunner右上のRun All Testsで実機上でテスト実行されますが、同時に計測も実行されます。
ビルド設定でIL2CPPを選んでいればIL2CPPで計測できますし、Android上でも問題なく実行できます。
メモリ使用量を測る
ちなみに実行速度ではなくメモリ使用量はProfier.BeginSample()とProfiler.EndSample()を使ってProfilerで確認できます。
using NUnit.Framework;
using UnityEngine.Profiling;
public sealed class PerformanceTest
{
private struct Struct
{
private float X { get; }
}
private class Class
{
private float X { get; }
}
[Test]
public void Test()
{
Profiler.BeginSample("MySample.StructAlloc");
var s = new Struct();
Profiler.EndSample();
Profiler.BeginSample("MySample.ClassAlloc");
var c = new Class();
Profiler.EndSample();
}
}
こちらを実行するとProfilerで以下の結果になります。structのnewではGC Allocが0ですがclassのnewでは20バイトのメモリアロケーションが発生していることがわかります。