軽い気持ちでLinkedListを使ったら休出する羽目になった話
を見てパフォーマンス検証したくなったので検証してみました。
改定 2018-11-21
Consoleはおそすぎてやはりよろしくないのと
参照に時間がかかるところを見たいため各要素1000回のgetを行う。
環境
.net core 2.1
当該記事はJAVAですがC#でも同じようなものだろう
というのと
手元環境で即動かせるのがにC#だったという理由だけでC#で書いてます
単純にstringのListを参照しまくります(それぞれ1000回ほど)。
#コード
static void Main(string[] args)
{
// init
var testlist = Enumerable.Repeat("a", 100000).ToList();
string buf;
Stopwatch sw = new Stopwatch();
// for
GC.Collect();
sw.Start();
for (var i = 0; i < testlist.Count; i++)
{
for (var cnt = 0; cnt < 1000; cnt++)
{
buf = testlist[i];
}
}
sw.Stop();
var forLoop = sw.ElapsedMilliseconds;
sw.Reset();
// foreach
GC.Collect();
sw.Start();
foreach (var i in testlist)
{
for (var cnt = 0; cnt < 1000; cnt++)
{
buf = i;
}
}
sw.Stop();
var foreachLoop = sw.ElapsedMilliseconds;
sw.Reset();
// ForEach
GC.Collect();
sw.Start();
testlist.ForEach((i) =>
{
for (var cnt = 0; cnt < 1000; cnt++)
{
buf = i;
}
});
sw.Stop();
var foreachmetLoop = sw.ElapsedMilliseconds;
Console.WriteLine("for Loop : " + forLoop + " ms");
Console.WriteLine("foreach Loop : " + foreachLoop + " ms");
Console.WriteLine("ForEach Loop : " + foreachmetLoop + " ms");
}
#結果
1回目
for Loop : 433 ms
foreach Loop : 207 ms
ForEach Loop : 230 ms
2回目
for Loop : 393 ms
foreach Loop : 216 ms
ForEach Loop : 217 ms
3回目
for Loop : 422 ms
foreach Loop : 222 ms
ForEach Loop : 227 ms
4回目
for Loop : 421 ms
foreach Loop : 215 ms
ForEach Loop : 219 ms
5回目
for Loop : 398 ms
foreach Loop : 219 ms
ForEach Loop : 213 ms
foreachが速いです。
普段から全件舐めるならforeachを使うべきとコードレビュー等で指摘していますが、
可読性の他に速度も有利になるということが検証でわかったので今後ともforeach推進派としてはレビュー指摘していきたい所存。
cnt < 10000
にしたところ
for Loop : 3967 ms
foreach Loop : 1984 ms
ForEach Loop : 2060 ms
まあ当然10倍の値だわな。
つまらん検証ですが自分が納得するための検証ですので以上です。