String output: format or concat in C#?

前端 未结 30 2009
一生所求
一生所求 2020-11-22 11:40

Let\'s say that you want to output or concat strings. Which of the following styles do you prefer?

  • var p = new { FirstName = \"Bill\", LastName = \"Ga

30条回答
  •  暖寄归人
    2020-11-22 11:57

    Strings are immutable, this means the same tiny piece of memory is used over and over in your code. Adding the same two strings together and creating the same new string over and over again doesn't impact memory. .Net is smart enough just to use the same memory reference. Therefore your code doesn't truly test the difference between the two concat methods.

    Try this on for size:

    Stopwatch s = new Stopwatch();
    
    int n = 1000000;
    long fElapsedMilliseconds = 0, fElapsedTicks = 0, cElapsedMilliseconds = 0, cElapsedTicks = 0, sbElapsedMilliseconds = 0, sbElapsedTicks = 0;
    
    Random random = new Random(DateTime.Now.Millisecond);
    
    string result;
    s.Start();
    for (var i = 0; i < n; i++)
        result = (random.Next().ToString() + " " + random.Next().ToString());
    s.Stop();
    cElapsedMilliseconds = s.ElapsedMilliseconds;
    cElapsedTicks = s.ElapsedTicks;
    s.Reset();
    
    s.Start();
    for (var i = 0; i < n; i++)
        result = string.Format("{0} {1}", random.Next().ToString(), random.Next().ToString());
    s.Stop();
    fElapsedMilliseconds = s.ElapsedMilliseconds;
    fElapsedTicks = s.ElapsedTicks;
    s.Reset();
    
    StringBuilder sb = new StringBuilder();
    s.Start();
    for(var i = 0; i < n; i++){
        sb.Clear();
        sb.Append(random.Next().ToString());
        sb.Append(" ");
        sb.Append(random.Next().ToString());
        result = sb.ToString();
    }
    s.Stop();
    sbElapsedMilliseconds = s.ElapsedMilliseconds;
    sbElapsedTicks = s.ElapsedTicks;
    s.Reset();
    
    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");
    Console.WriteLine(n.ToString() + " x sb.Clear();sb.Append(random.Next().ToString()); sb.Append(\" \"); sb.Append(random.Next().ToString()); result = sb.ToString(); took: " + (sbElapsedMilliseconds) + "ms - " + (sbElapsedTicks) + " ticks");
    Console.WriteLine("****************");
    Console.WriteLine("Press Enter to Quit");
    Console.ReadLine();
    

    Sample Output:

    1000000 x result = string.Format("{0} {1}", p.FirstName, p.LastName); took: 513ms - 1499816 ticks
    1000000 x result = (p.FirstName + " " + p.LastName); took: 393ms - 1150148 ticks
    1000000 x sb.Clear();sb.Append(random.Next().ToString()); sb.Append(" "); sb.Append(random.Next().ToString()); result = sb.ToString(); took: 405ms - 1185816 ticks
    

提交回复
热议问题