はじめに
河合さんの記事, 今はどうなっているのかな?という調査です.
neue cc - C#のGCゴミとUnity(5.5)のコンパイラアップデートによるListのforeach問題解決について
有名なforeachのGCゴミについてです.
テストコード
usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.Profiling;usingUnityEngine.UI;publicclassForEach:MonoBehaviour{[SerializeField]privateButtonbutton_=null;privateint[]array_=newint[]{1,2,3,4,5};privateList<int>list_=newList<int>{1,2,3,4,5};privatevoidStart(){button_.onClick.AddListener(onClick);}privatevoidonClick(){Profiler.BeginSample("GCAllocCheck:Array");foreach(variteminarray_){}Profiler.EndSample();Profiler.BeginSample("GCAllocCheck:List");foreach(variteminlist_){}Profiler.EndSample();}}
結果
バージョンごとに調査(したい).
5.6.4f1
起動後初めてボタンを押下した場合だけ, ゴミが出る. 原因は未調査.
まとめ
エディタ上で調査しているため, ビルドすると異なる可能性がある. もちろんターゲットにより異なる可能性がある.
原因はGetEnumeratorに関連しているため, ゴミが出る場合は, LINQを使うと目も当てられない結果になるだろう(調査していないため予測).
5.6.4f1
1回目だけ32 bytesゴミが出る. 原因まで調査していないため, 2回目以降必ずゴミが出ないかは不明.
コードの読みやすさ次第で使用できそうだが, クリティカルな箇所では for にしておく方がよさそう.