【Unity】C# List 速度計測
C# Listの計測を行いました。
ループ、削除、検索の内容で計測しています。
ループ回数は100回、1000回、100000回の3段階で行った。
Unity2018.3.1
ループ計測
forとforeachによって速度を計測行った。
計測2は速度が出るがやることが多いのが難点です。
// テストデータ
List<int> list = new List<int>();
for(int i = 0; i < ループ回数; i++) { list.Add(0); }
計測1 - forで継続条件式にCountを入れる
for(int i = 0; i < list.Count; i++) {}
100回 0.1375ms
1000回 0.1629ms
100000回 1.6828ms
計測2 - forで初期化にCountを入れる
for(int i = 0, n = list.Count; i < n; i++) {}
100回 0.0659ms
1000回 0.0775ms
100000回 1.0446ms
計測3 - foreach
foreach(var l in list)
100回 0.4404ms
1000回 0.4357ms
100000回 2.0311ms
計測4 - list.ForEach
list.ForEach(l => {})
100回 0.4156ms
1000回 0.4068ms
100000回 1.2882ms
削除計測
削除はRemoveAtとRemoveAllを計測しました。
数が多いとRemoveAt速度が落ちるので使う時は慎重にならないといけませんね。
// テストデータ
List<int> list = new List<int>();
for(int i = 0; i < ループ回数; i++) { list.Add(i % 10); }
計測1 - RemoveAt
for(int i = list.Count - 1; i >= 0; i--)
{
if(list[i] == 0) { list.RemoveAt(i); }
}
100回 0.2331ms
1000回 0.2541ms100000回 43.6128ms
計測2 - RemoveAll
list.RemoveAll(l => l == 0);
100回 0.4622ms
1000回 0.4871ms
100000回 1.6225ms
検索計測
検索はfor、indexOf、Findで行います。
// テストデータ
List<int> list = new List<int>();
for(int i = 0; i < ループ回数; i++) { list.Add(i); }
計測1 - for
for(int i = 0, n = list.Count; i < n; i++)
100回 0.0792ms
1000回 0.0904ms
100000回 0.2843ms
計測2 - indexOf
list.IndexOf(???);
100回 0.3885ms
1000回 0.3904ms
100000回 0.8299ms
計測3 - Find
list.Find(l => l == ???);
100回 0.3999ms
1000回 0.422ms
100000回 0.7525ms
まとめ
全体的にforが速いですが条件が増えると複雑になるため、
可読性を高めていくのがいいようにも思います。
ゲームのように毎フレーム更新するような場合はforで書くのがいいかもしれません。
0コメント