10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Unityでスクリプトのベンチマークをとる方法4選

Last updated at Posted at 2021-05-07

概要

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の方が手軽でオススメ。

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?