Concatenating multiple string literals or strings using the + operator creates a new string object for each concatenation. This can
lead to a large number of intermediate string objects and can be inefficient. The StringBuilder class is more efficient than string
concatenation, especially when the operator is repeated over and over as in loops.
Replace string concatenation with StringBuilder.
string str = "";
for (int i = 0; i < arrayOfStrings.Length ; ++i)
{
str = str + arrayOfStrings[i];
}
StringBuilder bld = new StringBuilder();
for (int i = 0; i < arrayOfStrings.Length; ++i)
{
bld.Append(arrayOfStrings[i]);
}
string str = bld.ToString();
| Method | Runtime | Mean | Standard Deviation | Allocated |
|---|---|---|---|---|
StringConcatenation |
.NET 9.0 |
50,530.75 us |
2,699.189 us |
586280.70 KB |
StringBuilder |
.NET 9.0 |
82.31 us |
3.387 us |
243.79 KB |
StringConcatenation |
.NET Framework 4.8.1 |
37,453.72 us |
1,543.051 us |
586450.38 KB |
StringBuilder |
.NET Framework 4.8.1 |
178.32 us |
6.148 us |
244.15 KB |
The results were generated by running the following snippet with BenchmarkDotNet:
[Params(10_000)]
public int Iterations;
[Benchmark]
public void StringConcatenation()
{
string str = "";
for (int i = 0; i < Iterations; i++)
{
str = str + "append";
}
}
[Benchmark]
public void StringBuilder()
{
StringBuilder builder = new StringBuilder();
for (int i = 0; i < Iterations; i++)
{
builder.Append("append");
}
_ = builder.ToString();
}
Hardware Configuration:
BenchmarkDotNet v0.14.0, Windows 10 (10.0.19045.5247/22H2/2022Update) 12th Gen Intel Core i7-12800H, 1 CPU, 20 logical and 14 physical cores [Host] : .NET Framework 4.8.1 (4.8.9282.0), X64 RyuJIT VectorSize=256 .NET 9.0 : .NET 9.0.0 (9.0.24.52809), X64 RyuJIT AVX2 .NET Framework 4.8.1 : .NET Framework 4.8.1 (4.8.9282.0), X64 RyuJIT VectorSize=256