ScreenPocket - 画面の隙間

Unityエンジニアの日々の雑記。たまにpython3とDirectXも触ります

Vector3に値を代入する速度を測ってみた

Unityエンジニアなら皆毎日使っているVector3。
値の代入方法は色々ありますが、
そういえば結局どれが早いのだろう?と気になったので測ってみました。

☆環境

  • Unity5.4.3f1
  • PCエディタで計測

☆試した方法

  • 下記4つを10,000,000回ずつ回した
    • new Vector3(x,y,z)を代入
    • Set(x,y,z)で値設定
    • .で直接値書き換え
    • [index]でxyzに値書き換え
	void Update ()
	{
		stopWatch.Reset();
		stopWatch.Start();
		for (int i = 0; i < 10000000; ++i)
		{
			test = new Vector3( Random.Range(0f,100f), Random.Range(0f, 100f), Random.Range(0f, 100f) );
		}
		stopWatch.Stop();
		UnityEngine.Debug.Log( "new : " + stopWatch.ElapsedMilliseconds+"ms" );

		stopWatch.Reset();
		stopWatch.Start();
		for (int i = 0; i < 10000000; ++i)
		{
			test.Set( Random.Range(0f, 100f), Random.Range(0f, 100f), Random.Range(0f, 100f) );
		}
		stopWatch.Stop();
		UnityEngine.Debug.Log("set : " + stopWatch.ElapsedMilliseconds + "ms");

		stopWatch.Reset();
		stopWatch.Start();
		for (int i = 0; i < 10000000; ++i)
		{
			test.x = Random.Range(0f, 100f);
			test.y = Random.Range(0f, 100f);
			test.z = Random.Range(0f, 100f);
		}
		stopWatch.Stop();
		UnityEngine.Debug.Log(". : " + stopWatch.ElapsedMilliseconds + "ms");

		stopWatch.Reset();
		stopWatch.Start();
		for (int i = 0; i < 10000000; ++i)
		{
			test[0] = Random.Range(0f, 100f);
			test[1] = Random.Range(0f, 100f);
			test[2] = Random.Range(0f, 100f);
		}
		stopWatch.Stop();
		UnityEngine.Debug.Log("[] : " + stopWatch.ElapsedMilliseconds + "ms");
	}
new set . []
new : 965ms set : 968ms . : 884ms [] : 1342ms
new : 958ms set : 936ms . : 836ms [] : 1321ms
new : 990ms set : 982ms . : 859ms [] : 1296ms
new : 937ms set : 950ms . : 885ms [] : 1363ms
new : 949ms set : 943ms . : 852ms [] : 1387ms
new : 1015ms set : 974ms . : 877ms [] : 1319ms
new : 963ms set : 946ms . : 876ms [] : 1357ms
new : 980ms set : 939ms . : 852ms [] : 1265ms
new : 993ms set : 980ms . : 895ms [] : 1345ms
new : 959ms set : 935ms . : 847ms [] : 1351ms

とまぁ、こんな結果に。

まぁstructだし.は早かろう。逆に[]は演算子オーバーライドだから重かろうという予想は大体あってました。
で、今回調べようと思ったキッカケのnew Vector3代入と、Set()の負荷比較ですが、
若干ながらSet()の方が軽いっぽい??

new Vector3の代入は、関数の実行タイミングがUpdate()の頭だから重いのかしら??
と思って実行順を替えてみたりもしましたが、大体new Vector3代入とSet()の負荷の差は似たような感じでした。

まぁ1千万回回して大体10ms位の差くらいなので小さな差ではありますが、
チリツモを考えるとnew Vector3代入の代わりにSet()を使っていくのも良いのではないでしょうか。


追記:なお、newとsetを逆にした場合の比較はこちら

set : 990ms new : 1009ms
set : 935ms new : 995ms
set : 930ms new : 964ms
set : 989ms new : 1015ms

ますます差が顕著になったような。