C#
定石4:性能比較— Stopwatch + GC.GetTotalMemory
出典: C# ファイルIO の正解 — StreamReader / File.ReadAllLines / File.ReadLines / using の使い分け — 定石4:性能比較— Stopwatch + GC.GetTotalMemory
// ✅定石4:性能比較(10万行×約100MBのログを想定)
const string path = @"C:\logs\big-app.log";
// ReadAllLines版(メモリに全部ロード)
GC.Collect(); GC.WaitForPendingFinalizers();
long memBefore = GC.GetTotalMemory(true);
var sw1 = Stopwatch.StartNew();
string[] all = File.ReadAllLines(path, Encoding.UTF8);
int errCnt1 = all.Count(l => l.Contains("ERROR"));
sw1.Stop();
long memAfter = GC.GetTotalMemory(false);
Console.WriteLine($"ReadAllLines: {sw1.ElapsedMilliseconds}ms / {(memAfter - memBefore)/ 1024 / 1024}MB / {errCnt1}件");
// ReadLines版(ストリーム読み込み)
GC.Collect(); GC.WaitForPendingFinalizers();
memBefore = GC.GetTotalMemory(true);
var sw2 = Stopwatch.StartNew();
int errCnt2 = File.ReadLines(path, Encoding.UTF8).Count(l => l.Contains("ERROR"));
sw2.Stop();
memAfter = GC.GetTotalMemory(false);
Console.WriteLine($"ReadLines : {sw2.ElapsedMilliseconds}ms / {(memAfter - memBefore)/ 1024 / 1024}MB / {errCnt2}件");
▸ 実行ボタンで結果を表示
Source収録記事
この snippet は記事の「定石4:性能比較— Stopwatch + GC.GetTotalMemory」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
5 件// ✅定石1: StreamReader + usingでShift-JIS読み込み using System.IO; using System.Text;未収録
定石1: StreamReader + using + Encoding指定
#3070cb2953d8
// ✅定石2: File.ReadAllLinesで一発配列化 using System.IO; using System.Text;未収録
定石2: File.ReadAllLines —小ファイル向きの一撃
#416c419f6cb7
// ✅定石3: File.ReadLinesで大ファイルをストリーム処理 using System.IO; using System.Text;未収録
定石3: File.ReadLines —大ファイルのストリーム読み込み
#275aa66b0c4b
// ✅定石5: FileShare.ReadWriteで同時アクセスを許可 using System.IO; using System.Text;未収録
定石5: FileShareで同時アクセスを扱う
#6cd0545383e7
// ✅定石6: BOMの有無で簡易判定(業務系で雑なエンコーディング判定) public static Encoding DetectEncoding(string path) { var bytes = new byte[4];未収録
定石6:エンコーディング判定の実践— Shift-JISとBOM付きUTF-8の見分け
#2c74893d554e
