LoginSignup
23
16

More than 5 years have passed since last update.

forとforeachのアクセス速度比較

Last updated at Posted at 2018-02-19

軽い気持ちで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倍の値だわな。

つまらん検証ですが自分が納得するための検証ですので以上です。

23
16
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
16