TomoGのごちゃまぜ倉庫

Unity Mathfは重いのか

今回はMathfが重いという記事を見たので、検証してみた記事です。
docs.unity3d.com

◇検証した関数

今回検証した関数は個人的によく使用する関数かつ、軽い代用ができやすい関数の3つです。
その3つの関数は
・Abs
・Max
・Min
です

◇検証結果

そこまで大きく変わらない。
強いて言えば、全体的に重いわけではなく関数によっては軽いものもある。

検証結果のグラフは以下のようになりました

Mathf Abs Max Min
int 0.0434 0.009 0.009
0.0159 0.011 0.011
float 0.0396 0.011 0.010
0.0143 0.013 0.012
単位はms
1回当たりにかかる平均処理時間

検証方法

ランダムで生成した1000個の長さの配列を生成。
その配列をMathfの有無によって分けて計測する。
この計測を1000回繰り返し、その平均を算出した。
Mathf無の関数は後述の検証コードを参照。

◇検証コード

    private int[] test = new int[1000];
    void Start()
    {
        for(int i = 0; i < 1000; i++)
        {
            test[i] = (int)UnityEngine.Random.Range(-1000, 1000);
        }

        TimeMeasurement(MaesurementProcess1, "Sample1", 1000);
        TimeMeasurement(MaesurementProcess2, "Sample2", 1000);
    }

    private void MaesurementProcess1()
    {
        Test3_1();
    }

    private void MaesurementProcess2()
    {
        Test3_2();
    }

    private void Test1_1()
    {
        for (int i = 0; i < 1000; i++)
        {
            Mathf.Abs(test[i]);
        }

    }

    private void Test1_2()
    {
        //int v;
        float v;
        for (int i = 0; i < 1000; i++)
        {
            v = (test[i] > 0) ? test[i] : -test[i];
        }
    }

    private void Test2_1()
    {
        Mathf.Max(test);
    }

    private void Test2_2()
    {
        float max = -100000;
        for(int i = 0; i < 1000; i++)
        {
            max = (max >= test[i]) ? max : test[i];
        }
    }

    private void Test3_1()
    {
        Mathf.Min(test);
    }

    private void Test3_2()
    {
        int min = 100000;
        for (int i = 0; i < 1000; i++)
        {
            min = (min <= test[i]) ? min : test[i];
        }
    }

    private void TimeMeasurement(Action action)
    {
        _TimeMeasurement(action, "", 1);
    }

    private void TimeMeasurement(Action action, string Tag)
    {
        _TimeMeasurement(action, Tag + " : ", 1);
    }

    private void TimeMeasurement(Action action, uint count)
    {
        _TimeMeasurement(action, "", count);
    }

    private void TimeMeasurement(Action action, string Tag, uint count)
    {
        _TimeMeasurement(action, Tag + " : ", count);
    }

    private void _TimeMeasurement(Action action, string Tag, uint count)
    {
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        float num = 0;
        for (uint i = 0; i < count; i++)
        {
            sw.Start();
            action();
            sw.Stop();
            float progress = (float)sw.Elapsed.TotalMilliseconds;
            num += progress;
            sw.Reset();
        }

        //Debug.Log(Tag + " num : " + num.ToString());
        Debug.Log(Tag + "Average : " + (num / (float)count).ToString());
    }

Test1がAbs
Test2がMax
Test3がMin

の検証です。

検証部分については以前の記事をご覧ください。
tomog.hatenablog.com