Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

qiitadon
Qiitadon(β)から生まれた Qiita ユーザー・コミュニティです。
https://qiitadon.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away