C#
性能比較— 10万回ループのStopwatch実測
出典: C# 文字列結合のパフォーマンス完全比較(+ / Concat / StringBuilder / Format / 補間) — 性能比較— 10万回ループのStopwatch実測
// ✅パターン6: Stopwatchで性能比較(10万回ループ)
const int N = 100_000;
var data = Enumerable.Range(0, N).Select(i => $"row{i}").ToArray();
// +演算子(NGパターン)
var sw1 = Stopwatch.StartNew();
string r1 = "";
foreach (var s in data)r1 += s + "\n";
sw1.Stop();
// String.Join
var sw2 = Stopwatch.StartNew();
string r2 = String.Join("\n", data);
sw2.Stop();
// StringBuilder
var sw3 = Stopwatch.StartNew();
var sb = new StringBuilder();
foreach (var s in data)sb.AppendLine(s);
string r3 = sb.ToString();
sw3.Stop();
Console.WriteLine($"+= : {sw1.ElapsedMilliseconds}ms");
Console.WriteLine($"Join: {sw2.ElapsedMilliseconds}ms");
Console.WriteLine($"SB : {sw3.ElapsedMilliseconds}ms");
▸ 実行ボタンで結果を表示
Source収録記事
この snippet は記事の「性能比較— 10万回ループのStopwatch実測」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
7 件// ✅パターン1: +演算子(少数結合) string greeting = "Hello, " + userName + "さん。今日もよろしくお願いします。"; string filePath = baseDir + "\\" + fileName;未収録
パターン1: +演算子—静的な少数結合の本命
#d77b30cce8dc
// ❌ NG:ループで+=は性能爆発 string result = ""; foreach (var row in dt.Rows.Cast<DataRow>()) {未収録
パターン1: +演算子—静的な少数結合の本命
#6dedf46f8327
// ✅パターン2: String.Concat / String.Join string[] parts = { "Hello", ", ", userName, "さん。" }; string greeting = String.Concat(parts);未収録
パターン2: String.Concat / String.Join —配列を一発で結合
#c0352c6eb408
// ✅パターン3: StringBuilder(ループ向き) var sb = new StringBuilder(); foreach (var row in dt.Rows.Cast<DataRow>()) {未収録
パターン3: StringBuilder —ループ・可変長の正解
#c688eae43693
// ✅パターン4: String.Format(フォーマット指定向き) string template = "{0}さん、{1:yyyy/MM/dd}の請求は{2:N0}円です。"; string message = String.Format(template, userName, dueDate, amount); // → "鈴木太郎さん、2026/06/30の請求は12,500円です。"未収録
パターン4: String.Format —フォーマット指定向き
#820dcac33498
// ✅パターン5:文字列補間(C# 6以降) string message = $"{userName}さん、{dueDate:yyyy/MM/dd}の請求は{amount:N0}円です。"; // → "鈴木太郎さん、2026/06/30の請求は12,500円です。"未収録
パターン5:文字列補間$"..." — C# 6以降の本命
#db4711ab2df6
