タイガーラック クリエイティブブログ
2026
March
12

C# LINQのパフォーマンス検証:for文と比較

C#を書いていると、かなりの頻度で登場する LINQ

可読性が高く、コードも短く書けるため便利ですが、ふとこんな疑問が出てきました。

「LINQって便利だけど、処理速度はどうなんだろう?」

今回はこの疑問について、簡単なコードで検証してみました。

疑問

LINQは以下のように書けてとても便利です。

var result = list.Where(x => x % 2 == 0).ToList();

しかし内部では

  • デリゲート
  • イテレーター
  • 列挙処理

などが動いているため、

「普通のfor文より遅いのでは?」

という印象を持つことがあります。

そこで今回は

  • for文
  • LINQ

で同じ処理を実行し、どれくらい差があるのか確認してみます。

検証内容

今回の検証内容はシンプルです。

『 100万件の整数リストから偶数だけ取り出す

こちらの処理で検証します。

検証コード

まず、100万件の整数リストを用意します。

var list = Enumerable.Range(1, 1_000_000).ToList();

今回はこのデータから 偶数だけを抽出する処理を比較します。

LINQの場合

var result = list
    .Where(x => x % 2 == 0)
    .ToList();

for文の場合

var result = new List<int>();

for (int i = 0; i < list.Count; i++)
{
    if (list[i] % 2 == 0)
    {
        result.Add(list[i]);
    }
}

計測用コード

実際の計測は Stopwatch を使って行いました。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

class Program
{
    static void Main()
    {
        var list = Enumerable.Range(1, 1_000_000).ToList();

        // LINQ
        var sw = Stopwatch.StartNew();

        var linqResult = list.Where(x => x % 2 == 0).ToList();

        sw.Stop();
        Console.WriteLine($"LINQ : {sw.ElapsedMilliseconds} ms");

        // for
        sw.Restart();

        var forResult = new List<int>();

        for (int i = 0; i < list.Count; i++)
        {
            if (list[i] % 2 == 0)
            {
                forResult.Add(list[i]);
            }
        }

        sw.Stop();
        Console.WriteLine($"for : {sw.ElapsedMilliseconds} ms");
    }
}

結果

環境によって多少差はありますが、概ね次のような結果になります。

LINQ : 25 ms
for : 15 ms

LINQは内部で delegate 呼び出しや IEnumerable の列挙処理などが行われるため、
単純なループよりもオーバーヘッドがあり、少し遅くなるようでした。

ただし差は、数ミリ秒〜十数ミリ秒程度

体感できる差にはなりません。

LINQで気をつけたほうがよさそうな書き方

調べている中で、LINQ自体よりも
使い方によって大きく遅くなるケースがあることも知りました。

例えば次のようなコードです。

foreach (var id in ids)
{
    var item = list.FirstOrDefault(x => x.Id == id);
}

この書き方では、foreach のたびに list の先頭から対象を探すことになります。
そのため、データ量が増えると検索回数も大きく増えてしまいます。

例えば、listが1000件、idsが1000件ある場合、
最大で1000 × 1000回の比較が発生します。

このような場合は、あらかじめ Dictionary に変換しておくことで、
IDを使って直接データを取得できるようになります。

var dict = list.ToDictionary(x => x.Id);

foreach (var id in ids)
{
    var item = dict[id];
}

ただし、こちらはLINQが遅いというより、アルゴリズムの問題によるものです。

まとめ

今回の検証結果をまとめると次の通りです。

LINQの速度

  • for文よりは やや遅い
  • ただし 通常の業務処理ではほぼ問題にならない

LINQを使うメリット

  • コードが短くなる
  • 可読性が高い
  • バグが減る

LINQを避けた方がいいケース

  • 数千万件レベルの大量データ
  • 内側ループなどの 超高頻度処理
  • LINQを ループの中で何度も呼ぶ処理

結論

LINQは

「基本は便利に使ってOK。ボトルネックになったら見直す」

くらいのスタンスがちょうどよさそうです。

可読性と保守性を考えると、むしろ LINQの恩恵の方が大きい場面が多いと感じました。

参考になれば幸いです。

このカテゴリの最新記事

関連記事

SHOP LIST

タイガーラック株式会社

〒577-0056
大阪府東大阪市長堂1-3-14 TOKUYASU Bld.