動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
C#

定石3:メモリ消費の実測比較— Stopwatch + GC.GetTotalMemory

出典: C# DataReader vs DataAdapter — メモリ消費と性能の使い分け(業務SE 判断軸)定石3:メモリ消費の実測比較— Stopwatch + GC.GetTotalMemory

定石3:メモリ消費の実測比較— Stopwatch + GC.GetTotalMemory (csharp)#8e4ad96d6711
// ✅定石3:メモリ・実行時間の実測比較
const string sql = "SELECT id, name, memo, amount, created_at FROM big_log";
 
// --- DataAdapter版---
GC.Collect(); GC.WaitForPendingFinalizers();
long memBefore = GC.GetTotalMemory(true);
var sw1 = Stopwatch.StartNew();
 
DataTable dt = new DataTable();
using (var conn = new SqlConnection(connStr))
using (var adapter = new SqlDataAdapter(sql, conn))
{
    adapter.Fill(dt);   // 10万件をメモリに全部ロード
}
sw1.Stop();
long memAfter = GC.GetTotalMemory(false);
Console.WriteLine($"DataAdapter: {sw1.ElapsedMilliseconds}ms / {(memAfter - memBefore)/ 1024 / 1024}MB");
 
// --- DataReader版---
GC.Collect(); GC.WaitForPendingFinalizers();
memBefore = GC.GetTotalMemory(true);
var sw2 = Stopwatch.StartNew();
 
int rowCount = 0;
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand(sql, conn))
{
    conn.Open();
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            rowCount++;
            // CSVに1行ずつ書き出すイメージ(メモリには溜めない)
        }
    }
}
sw2.Stop();
memAfter = GC.GetTotalMemory(false);
Console.WriteLine($"DataReader : {sw2.ElapsedMilliseconds}ms / {(memAfter - memBefore)/ 1024 / 1024}MB");
▸ 実行ボタンで結果を表示
  • id: #8e4ad96d6711
  • lines: 40
  • extracted: 2026-06-10
  • captured: 2026-06-10

Source収録記事

この snippet は記事の「定石3:メモリ消費の実測比較— Stopwatch + GC.GetTotalMemory」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。

同じ記事から

4
図鑑トップ