Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9366

UnityでListの最小値を取得する最速の方法

$
0
0

A*経路探索のコードを書いていてListの最小値を取得する最速の方法が気になったので検証してみました。
前回、速度比較のやり方を模索してみたのはこの為だったりします。

for文 vs List.Min

普通にfor文で全要素を一つづつ比較していくのとList.Minではどっちが速いんでしょうか?
ついでにLinqのOrderByしてFirstした場合も比較してみます。

コードは以下です。
0~100000のランダムな整数の入った要素数10万のListを宣言してその中から最小値を取得、
Profiler.BeginSample/EndSampleで、最小値を取得する部分だけを計測しています。

publicclassMinTest{//for文のやつ[Test]publicvoidUseFor(){varrandamValues=GetRandamValues();Profiler.BeginSample("MinTest.UseFor");varmin=randamValues[0];for(inti=1;i<randamValues.Count;i++){min=randamValues[i]<min?randamValues[i]:min;}Profiler.EndSample();Debug.Log(min);}//ListMin[Test]publicvoidUseListMin(){varrandamValues=GetRandamValues();Profiler.BeginSample("MinTest.UseListMin");varmin=randamValues.Min();Profiler.EndSample();Debug.Log(min);}//OrderByしてFirst[Test]publicvoidUseOrderByFirst(){varrandamValues=GetRandamValues();Profiler.BeginSample("MinTest.UseOrderByFirst");varmin=randamValues.OrderBy(x=>x).First();Profiler.EndSample();Debug.Log(min);}List<int>GetRandamValues(){varrandamValues=newList<int>();for(inti=0;i<100000;i++){randamValues.Add(Random.Range(0,100000));}returnrandamValues;}}

結果

GC AllocTime
UseFor0B1.18ms
UseListMin40B1.49ms
UseOrderByFirst136B3.92ms

for文 vs List.Minは速度には気にするほどの差は出ませんが、List.MinはGC Allocが発生してしまいますね。
Linqは普通に遅かった・・・

条件分岐の書き方で差は出るの?

やっぱり普通にfor文使うのが速いですね。
しかし、もう一つ気になることがあります。
条件分岐の書き方で差が出るかどうかです。

//for文のやつ[Test]publicvoidUseFor(){varrandamValues=GetRandamValues();Profiler.BeginSample("MinTest.UseFor");varmin=randamValues[0];for(inti=1;i<randamValues.Count;i++){min=randamValues[i]<min?randamValues[i]:min;//←ここの書き方で差は出るの?}Profiler.EndSample();Debug.Log(min);}

以下の3つを試してみます

①if文

if(randamValues[i]<min)min=randamValues[i];

②条件演算子

min=randamValues[i]<min?randamValues[i]:min;

③条件演算子(条件式を反転)

min=randamValues[i]>=min?min:randamValues[i];

結果

誤差で結果が上下するので、1000回の平均を計測しました。
微妙に差が出ますが、気にするレベルではないですね。

GC AllocTime
①if文0B1.28120ms
②条件演算子0B1.26898ms
③条件演算子(条件式を反転)0B1.24765ms

まとめ

普通にfor文使うのが速いしGC Allocも発生しない!

ご意見ご感想、多分これが一番速いと思います等ありましたらコメントを頂けますと幸いです!


Viewing all articles
Browse latest Browse all 9366

Latest Images

Trending Articles