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の恩恵の方が大きい場面が多いと感じました。
参考になれば幸いです。
このカテゴリの最新記事
2025.10.22
2024.12.06
2025.10.23
2023.05.24