[C#] StringBuilder

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by CodeSender:), 20 Aug 2010.

  1. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Подскажите пожалуйста, читал в какой-то книге что приминение StringBuilder намного быстрее обычного конката текста, например:

    1) string text = "this" + "is" + "my" + "text.";

    2) StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.AppendFormat("{0}{1}{2}{3}", new object[] { "this ", "is ", "my ", "text." });

    По мнению авторов книги второй способ выполнится быстрее, это так?
     
  2. Bers

    Bers Member

    Joined:
    17 May 2010
    Messages:
    78
    Likes Received:
    30
    Reputations:
    26
    быстрее будет вот это:
    Code:
    var sb = new StringBuiilder();
    sb.Append("this");
    sb.Append("is");
    sb.Append("my");
    sb.Append("text");
    
    var text = sb.ToString();
    
    вариант
    Code:
     
    stringBuilder.AppendFormat("{0}{1}{2}{3}", new object[] { "this ", "is ", "my ", "text." });
    
    явно внесет накладные расходы хотя бы на разбор форматной строки. По скорости он будет примерно равен такому коду:
    Code:
     
    var text = string.Format("{0}{1}{2}{3}", new object[] { "this ", "is ", "my ", "text." });
    
    дело в том, что string.Format() по сути обертка над StringBuilder.AppendFormat().


    вообще, дело тут не только в скорости. Строки в .Net иммутабельны, поэтому любая конкатерация на самом деле создает новую строку. поэтому без использования StringBuilder такие конкатерации будут создавать много лишних строк, а это - лишняя нагрузка на сборщик мусора.
    С другой стороны, если этот код вызывается только один раз (настройки, например, прочитать), тогда в принципе это не критично
     
    #2 Bers, 20 Aug 2010
    Last edited: 20 Aug 2010