Speeding Up The StringBuilder Using An ObjectPool

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.

Speeding Up the StringBuilder Using an ObjectPool

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.

Up Next
    Ebook Download
    View all
    Learn
    View all
    Software architecture, code & app performance, code quality, Microsoft .NET & mentoring. Available!