Это интересный вопрос, и один, который был researched.
Ответ, да, в экстремальных условиях испытаний это более эффективно использовать один экземпляр и использовать его, чем создавать новую StringBuilder
каждый раз.
Но, нет, это почти никогда не необходимо и, вероятно, плохая идея в большинстве случаев. Другие соображения, такие как безопасность потока, как правило, более важны, чем микрооптимизация преждевременно.
Следующий код из linked article делает весьма искусственный тест производительности:
using System;
using System.Diagnostics;
using System.Text;
class Program
{
static string Method1()
{
StringBuilder builder = new StringBuilder();
foreach (string value in _array)
builder.Append(value);
return builder.ToString();
}
static StringBuilder _builder = new StringBuilder();
static string Method2()
{
StringBuilder builder = _builder;
builder.Clear();
foreach (string value in _array)
builder.Append(value);
return builder.ToString();
}
static string[] _array = { "dot", "net", "perls", "string", "array" };
const int _max = 1000000;
static void Main()
{
Method1();
Method2();
// Version 1: use new StringBuilder each time.
var s1 = Stopwatch.StartNew();
for (int i = 0; i < _max; i++)
{
Method1();
}
s1.Stop();
// Version 2: reuse a single StringBuilder instance.
var s2 = Stopwatch.StartNew();
for (int i = 0; i < _max; i++)
{
Method2();
}
s2.Stop();
Console.WriteLine(s1.Elapsed.TotalMilliseconds);
Console.WriteLine(s2.Elapsed.TotalMilliseconds);
Console.Read();
}
}
В результате (я просто запустить его сам):
- Многократное распределение: 146,21
- StringBuilder в поле: 98.96
Новый 'StringBuilder' не дорого для initia Лиза. Не оптимизируйте неправильные вещи –
Зависит от прецедента. Но 'StringBuilder' не стоит слишком дорого выделять. И если это проблема, вы всегда можете создать пул строителей для использования. Как правило, создание элемента уровня класса будет больно, если вы хотите обеспечить безопасность потока. –
На самом деле это зависит. Если у вас много методов (например, сотни, что делает для меня не слишком много смысла), то наличие члена имеет смысл ... но до тех пор, пока это происходит только в несколько раз, накладные расходы действительно незначительны. – gregkalapos