読者です 読者をやめる 読者になる 読者になる

ぎじぶろ

技術資料をまとめていくブログ

処理の負荷を計測する方法

Unity C# 検証

プログラマーなら誰しもが思う処理の負荷。
昔は動けばいいやと思っていたけど、厳密に処理の違いでどれくらいのパフォーマンスが違うかは知っておかなければいけない。

Unity で処理負荷について調べてると、色々とやり方があるようで
・Time.realtimeSinceStartup を使った検証
・Stopwatch クラスを使った検証

それぞれでやり方について調べてみた。

Time.realtimeSinceStartup を使った検証

Unity のスクリプトリファレンス
https://docs.unity3d.com/jp/current/ScriptReference/Time-realtimeSinceStartup.html
上記のリファレンスサイトではFPSの計測を行っている模様

例えばこれを処理の負荷で検証する時は処理の前後で以下のように記述してあげれば良い。

float time = Time.realtimeSinceStartup; // ゲーム開始から現在までの時間を取得

for (int i = 0, il = 100000; i < il ; i++ )
{
        // 検証したい処理
}
time = Time.realtimeSinceStartup - time; // 現在までの時間から、処理前の時間を引く
Debug.Log( "time: " + time.ToString() + "sec" );

Stopwatch クラスを使った検証

Stopwatch クラスのリファレンス
https://msdn.microsoft.com/ja-jp/library/system.diagnostics.stopwatch(v=vs.110).aspx
[C#] Stopwatch クラスで処理時間を計測する方法
https://code.msdn.microsoft.com/windowsdesktop/C-Stopwatch-14e2440d

例えば処理の計測をしたい場合は以下のように記述してあげれば良い。

var stopWatch = new System.Diagnostics.Stopwatch(); // Stopwatch 型の宣言(Start あたりで定義しておいていい)
stopWatch.Start(); // ストップウォッチスタート
for (int i = 0, il = 100000; i < il ; i++ )
{
        // 検証したい処理
}
stopWatch.Stop(); // ストップウォッチストップ
Debug.Log( "time: " + stopWatch.Elapsed.ToString() + "sec" ); // スタートからストップまでの時間を表示

どっちの方がいい?

Unity で処理の負荷だけを見るならTime.realtimeSinceStartup を使った方が良さそうな感じ。
・Time.realtimeSinceStartup は Stopwatch クラスと違って定義をしなくても動く
・Stopwatch と違ってステートの切り替えが必要ない(Start→Stop→Reset など)

Stopwatch の方がより細かい時間まで見れるので、そこは検証の方法によって分けるのがいいかと思う。

極論を言ってしまうと、処理Aと処理Bの速度を比較するような場合は
Time.realtimeSinceStartup と Stopwatch を混在させるような事がなければ
どちらを使っても良いかと思います。
(筆者は主に Time.realtimeSinceStartup を使って計測していきます)