C#
定石3:メモリ消費の実測比較— Stopwatch + GC.GetTotalMemory
出典: C# DataReader vs DataAdapter — メモリ消費と性能の使い分け(業務SE 判断軸) — 定石3:メモリ消費の実測比較— Stopwatch + GC.GetTotalMemory
// ✅定石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");
▸ 実行ボタンで結果を表示
Source収録記事
この snippet は記事の「定石3:メモリ消費の実測比較— Stopwatch + GC.GetTotalMemory」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
4 件// ✅定石1: SqlDataReaderでストリーム読み取り using (var conn = new SqlConnection(connStr)) using (var cmd = new SqlCommand("SELECT id, name, amount FROM order_log WHERE status = @s", conn)) {未収録
定石1: DataReaderの最小コード—ストリーム読み取り
#1804e9186ec0
// ✅定石2: SqlDataAdapterでDataTableにバルクロード DataTable dt = new DataTable(); using (var conn = new SqlConnection(connStr))未収録
定石2: DataAdapterの最小コード— DataTableバルクロード
#b20554e37854
// ❌ NG: DataReader.GetInt32()にNULLが来ると例外 int id = reader.GetInt32(0); // NULL行でSqlNullValueException // ✅ OK: DataReaderはIsDBNullで先にチェック未収録
定石4: NULL値ハンドリングの違い
#a39fc22a5b9a
// ✅定石4-b: DataReader用NULL安全ヘルパー public static class ReaderEx { public static int? GetIntOrNull(this SqlDataReader r, int i)未収録
定石4: NULL値ハンドリングの違い
#e782c17c1e04
