If you weren’t aware, Microsoft .NET has a type called the ObjectPool that can be used to speed up performance since objects are pooled, instead of creating a new one each time it’s needed. In this article, I will show you how to use it with the StringBuilder.
256 Seconds with dotNetDave
To show you how to use the StringBuilder with an ObjectPool, I have created a new episode of 256 Seconds with dotNetDave.
https://vimeo.com/743169409
The Code
First, create the pool in a field as shown below:
private readonly ObjectPool<StringBuilder> _stringBuilderPool =
new DefaultObjectPoolProvider().CreateStringBuilderPool();
To use it, get the StringBuilder from the pool using the Get() as shown below.
var sb = this._stringBuilderPool.Get();
Then use the StringBuilder as normal as shown in this example that simulates concatenating strings from an array.
for (var index = 0; index < this._stringArray.Length; index++)
{
_ = sb.Append(this._stringArray[index]);
}
When the StringBuilder is no longer needed, return it back to the pool.
_stringBuilderPool.Return(sb);
Benchmark Results
As you can see from the benchmark report for .NET 6, in all cases using the ObjectPool is slightly more performant. The benchmark report for .NET 7 shows similar results.
Allocations
There is a difference with the allocations for these three benchmark tests.
- Append() is 440 – 25,632 bytes
- Append() with ObjectPool is 96 to 21,832 bytes
Summary
The next time you need to use the StringBuilder, consider using it from an ObjectPool for a performance gain! There are more performance tips documented in my book Rock Your Code: Code and App Performance for Microsoft .NET which is available on Amazon.com.
If you have any comments, please make them below.