1. ホーム
  2. c#

[解決済み] 文字列出力:C#でformatまたはconcat?

2022-04-20 11:03:59

質問内容

文字列を出力したり、連結したりする場合を考えてみましょう。次のうち、どのスタイルがいいでしょうか?

  • var p = new { FirstName = "Bill", LastName = "Gates" };

  • Console.WriteLine("{0} {1}", p.FirstName, p.LastName);

  • Console.WriteLine(p.FirstName + " " + p.LastName);

あなたは、formatを使うか、それとも単に文字列を連結するか、どちらを選びますか?あなたのお気に入りは何ですか?どちらか一方でも目が痛くなりませんか?

どちらかを使って、もう一方を使わない合理的な理由はありますか?

私なら2番目にします。

解決方法は?

このコードを試してみてください。

あなたのコードを少し修正したものです。

  1. Console.WriteLineは、おそらく私が測定しようとしているものより数桁遅いので、削除しました。

  2. ループの前にストップウォッチをスタートさせ、ループの直後にストップウォッチをストップさせることで、例えば関数の実行に26.4ティックかかる場合でも精度を落とさないようにしています。

  3. 反復計算で結果を分割する方法が間違っていました。1,000ミリ秒と100ミリ秒の場合、どうなるかを見てみましょう。どちらの場合でも、1,000,000で割ると0ミリ秒になります。

コード

Stopwatch s = new Stopwatch();

var p = new { FirstName = "Bill", LastName = "Gates" };

int n = 1000000;
long fElapsedMilliseconds = 0, fElapsedTicks = 0, cElapsedMilliseconds = 0, cElapsedTicks = 0;

string result;
s.Start();
for (var i = 0; i < n; i++)
    result = (p.FirstName + " " + p.LastName);
s.Stop();
cElapsedMilliseconds = s.ElapsedMilliseconds;
cElapsedTicks = s.ElapsedTicks;
s.Reset();
s.Start();
for (var i = 0; i < n; i++)
    result = string.Format("{0} {1}", p.FirstName, p.LastName);
s.Stop();
fElapsedMilliseconds = s.ElapsedMilliseconds;
fElapsedTicks = s.ElapsedTicks;
s.Reset();


Console.Clear();
Console.WriteLine(n.ToString()+" x result = string.Format(\"{0} {1}\", p.FirstName, p.LastName); took: " + (fElapsedMilliseconds) + "ms - " + (fElapsedTicks) + " ticks");
Console.WriteLine(n.ToString() + " x result = (p.FirstName + \" \" + p.LastName); took: " + (cElapsedMilliseconds) + "ms - " + (cElapsedTicks) + " ticks");
Thread.Sleep(4000);

以上が私の結果です。

<ブロッククオート

1000000 x result = string.Format("{0} {1}", p.FirstName, p.LastName); took: 618ms - 2213706 ticks

1000000 x result = (p.FirstName + " " + p.LastName); took: 166ms - 595610 ticks