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バイトのメモリアロケーションが発生していることがわかります。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントする