Vector3の一部を変更する時にnew Vector3を避けるべきか?


transform.position等を操作する時、「z軸だけを変更したい」といったケースが多い。

その場合
org = new Vector3(org.x, org.y, org.z + XX);
が良いのか、
org += Vector3.right * XX;
とするべきなのか。

あるいは「xz軸だけ取り出したい(y=0にしたい)」場合にも

org = new Vector3(org.x, 0f, org.z);
が良いのか、
org -= Vector3.up * org.y;
とするべきなのか。

new Vector3は処理が重いので乱用してはならないという話は良く聞くが、Vector3.up/right/forwardも重いという話を聞くので、実際に比べてみた。

(10/2追加) Vector3.rightは、内部的にnew Vector3をやっているとのコメントを受けて、あらかじめメモリ内にVector3.right結果を保管して使い回すパターンも追加。

float b = 1f;
Vector3 a;

var sw = new System.Diagnostics.Stopwatch();

for (int j = 0; j < 10; j++)
{
    sw = new System.Diagnostics.Stopwatch();
    a = new Vector3(1f, 2f, 3f);
    sw.Start();
    for (int i = 0; i < 100000f; i++)
        a = new Vector3(a.x, a.y, a.z + b);  //毎回new Vector3を実行

    TimeSpan res1 = sw.Elapsed;
    sw.Stop();

    sw = new System.Diagnostics.Stopwatch();
    a = new Vector3(1f, 2f, 3f);
    sw.Start();
    for (int i = 0; i < 100000f; i++)
        a += Vector3.right * b;  //Vector3.rightを使って計算

    TimeSpan res2 = sw.Elapsed;
    sw.Stop();

    sw = new System.Diagnostics.Stopwatch();
    Vector3 right = Vector3.right;  //あらかじめ用意したベクトルを使い回す
    a = new Vector3(1f, 2f, 3f);
    sw.Start();
    for (int i = 0; i < 100000f; i++)
        a += right * b;

    TimeSpan res3 = sw.Elapsed;
    sw.Stop();

    Debug.Log("new Vector3:" + res1 + "   +Vector3.right:" + res2 + "   +right:" + res3);
}

10回測定した結果は
new Vector3:00:00:00.0024888 +Vector3.right:00:00:00.0050720 +right:00:00:00.0058805
new Vector3:00:00:00.0018079 +Vector3.right:00:00:00.0048435 +right:00:00:00.0046762
new Vector3:00:00:00.0018118 +Vector3.right:00:00:00.0045480 +right:00:00:00.0050064
new Vector3:00:00:00.0018308 +Vector3.right:00:00:00.0044770 +right:00:00:00.0047784
new Vector3:00:00:00.0020278 +Vector3.right:00:00:00.0046388 +right:00:00:00.0046788
new Vector3:00:00:00.0018587 +Vector3.right:00:00:00.0045241 +right:00:00:00.0046999
new Vector3:00:00:00.0018140 +Vector3.right:00:00:00.0044989 +right:00:00:00.0051078
new Vector3:00:00:00.0019138 +Vector3.right:00:00:00.0044852 +right:00:00:00.0045006
new Vector3:00:00:00.0020559 +Vector3.right:00:00:00.0044618 +right:00:00:00.0044280
new Vector3:00:00:00.0017473 +Vector3.right:00:00:00.0044658 +right:00:00:00.0044725

new Vector3を使う方が、Vector3.rightを加算するより2倍早い。
Vector3.rightを変数に格納して使い回す方法でも変わらない様子。

計算に使うaやbを毎回ループ内で定義しなおしてみたり、乱数を入れた後に計算させてみても変わらなかった。
上記はWindows上での結果だが、android上でも同様。

これは同じframe内でループした結果であって、多数のオブジェクトがUpdate()内で毎frameに1回ずつ実行するような場合は変わるのだろうか?