Unity

this.transformを計測してみた

More than 1 year has passed since last update.

this.transformがGetComponentを行なっており重いと聞いたので、実際に計測してみた

テストした際のスクリプト

// キャッシュしたtransformを取得するプロパティ
protected Transform mTrans;
public Transform cachedTransform { get { if (mTrans == null)        mTrans = transform; return mTrans; } }
public Transform cachedTransform2 { get { return mTrans; } }

// 01   普通にtransformを取得
for (int i = 0; i < number_of_tests; i++)
{
    Transform test = this.transform;
    //yield return 0;
}

// 02   キャッシュしておくプロパティから取得
for (int i = 0; i < number_of_tests; i++)
{
    Transform test = this.cachedTransform;
    //yield return 0;
}

// 03   ローカル変数にキャッシュしてそれを参照する
Transform cache = this.transform;
for (int i = 0; i < number_of_tests; i++)
{
    Transform test = cache;
    //yield return 0;
}

// 04   cachedTransformプロパティ内の処理を抜き出した版(プロパティのオーバーヘッドをみてみた)
mTrans = null;
for (int i = 0; i < number_of_tests; i++)
{
    if (mTrans == null)
        mTrans = transform;
    Transform test = mTrans;
    //yield return 0;
}

// 05   cachedTransformのifで存在チェックをしない版(プロパティ内の処理負荷の違いをみてみた)
mTrans = this.transform;
for (int i = 0; i < number_of_tests; i++)
{
    Transform test = cachedTransform2;
    //yield return 0;
}

計測結果

number_of_tests = 100

00: 0.01573563(ms)
01: 0.08511543(ms)
02: 0.005483627(ms)
03: 0.010252(ms)
04: 0.03743172(ms)

number_of_tests = 1000

00: 0.1368523(ms)
01: 0.223875(ms)
02: 0.1990795(ms)
03: 0.1330376(ms)
04: 0.1192093(ms)

number_of_tests = 100(yield return あり)

00: 0.1575947(ms)
01: 0.3004074(ms)
02: 0.01096725(ms)
03: 0.09155273(ms)
04: 0.1583099(ms)

number_of_tests = 1000(yield return あり)

00: 1.351833(ms)
01: 0.9250641(ms)
02: 0.05340576(ms)
03: 0.6370544(ms)
04: 0.4959106(ms)

計測してみて

・メモリキャッシュにのっている状態であれば、this.transformでもそこそこ早いがローカル変数にキャッシュした方が無難

・ローカル変数でも、キャッシュから外れると重い

・プロパティでもオーバーヘッドが重いようなので、変数にキャッシュしておいた方が軽い

cachedTransformとローカル変数にキャッシュしたものを使うのを場合によって併用するのが作りやすそうか