渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

ToArray、ToListを呼ばない工夫をする


f:id:esakun:20150730215258g:plain

今回も小ネタです。
時々以下のようなコードに出会います。

void Foo ()
{
    List<int> list = new List<int>(){0, 1, 2, 3, 4,5, 6};
    Convert(list.ToArray());
}

void Convert (int[] arr)
{
    // Do Something....
}

一見問題なさそうなのですが、ToArray関数をわざわざ呼んでいるのが気になります。

f:id:esakun:20170428235411p:plain
このようにヒープ領域を60バイト程使用することになります。
※要素数によってこの値は増減します

ToArray関数は新たに配列を生成しているため、要素数にも依りますが、軽い処理とは言えません。使わないで良いなら極力使いたくありません。
※ToList関数も同様です

ちなみにToArray関数は以下のような実装になっています。

public T[] ToArray()
{
    T[] array = new T[this._size];
    Array.Copy(this._items, 0, array, 0, this._size);
    return array;
}

IListインターフェースを使用して回避

List型、Array型どちらもIListインターフェースを実装しているため、以下のようにIListを引数にしてあげることでToArrayを回避できます。

void Foo ()
{
    List<int> list = new List<int>(){0, 1, 2, 3, 4,5, 6};
    Convert(list);
}

void Convert (IList<int> arr)
{
    // Do Something....
}

f:id:esakun:20170428235555p:plain

こうすることでGCAllocを0にすることが出来ます。

ひとこと

最近UnityのWindows環境開発を始めてみたのですが、Visual Studio、ILSpy最高っす。

あわせてどうぞ

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info