【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.2541ms

100000回 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で書くのがいいかもしれません。

ひさかた@Unity

プログラムを勉強中です

0コメント

  • 1000 / 1000