StringPool 1.0.4
dotnet add package StringPool --version 1.0.4
NuGet\Install-Package StringPool -Version 1.0.4
<PackageReference Include="StringPool" Version="1.0.4" />
<PackageVersion Include="StringPool" Version="1.0.4" />
<PackageReference Include="StringPool" />
paket add StringPool --version 1.0.4
#r "nuget: StringPool, 1.0.4"
#:package StringPool@1.0.4
#addin nuget:?package=StringPool&version=1.0.4
#tool nuget:?package=StringPool&version=1.0.4
StringPool
Introduction
- A high-performance string pooling library based on .NET9's
ArrayPooldesign, optimized for reusing string instances. - Reduces memory allocations and GC pressure by efficiently managing string lifetimes in performance-sensitive scenarios.
Features
- ✅ GC Optimization: Minimizes string allocations by reusing pooled instances.
- ✅ Thread-Safe: Supports concurrent operations for multithreaded applications.
- ✅ Lightweight: Low-overhead design with minimal runtime impact.
- ✅ Seamless Integration: Simple API to replace ad-hoc string caching or frequent allocations.
Why?
- Frequent short-lived string allocations can degrade performance in high-throughput applications.
- Existing solutions like
ArrayPoolor manual caching lack dedicated support for string pooling. StringPoolprovides a standardized, efficient way to manage reusable strings without GC overhead.
How to use?
StringPool
public string Rent(int minimumLength)- Rent a string with at least the specified length from the pool.
public void Return(string array, bool clearArray = true)- Return a string to the pool,
- when
clearArrayis true (default), the string will be zeroed.
public string Rent(ReadOnlySpan<char> buffer)- Rent a string with at least the specified buffer's length from the pool,
- and copies the content from the buffer.
UnsafeString
public bool SetText(ReadOnlySpan<char> buffer)Rents a new internal buffer if the current buffer is
null;or resizes the internal buffer if the current buffer's capacity is insufficient.
Then copies characters from the provided
ReadOnlySpan<char> bufferinto the internal buffer,returns
trueif a new buffer was rented,returns
falseif no new buffer was rented.You can use
public static implicit operator string?(UnsafeString? @string)to convert anUnsafeStringto astring,the string's
Lengthwill be equal tobuffer.Length.
public void Dispose()- Resets the internal string and returns it to the pool,
- then sets the internal string to
null.
Customization
You can use:
public static unsafe void Custom(Func<double> getMemoryPressure)public static unsafe void Custom(nint getMemoryPressure)public static unsafe void Custom(delegate* managed<double> getMemoryPressure)
to customize how
StringPooldetermines memory pressure for its automaticTrim()behavior.< 0.7→ low[0.7, 0.9)→ medium>= 0.9→ high
You can use:
public static void Configure(int DOTNET_SYSTEM_BUFFERS_SHAREDSTRINGPOOL_MAXSTRINGSPERPARTITION = 256, int DOTNET_SYSTEM_BUFFERS_SHAREDSTRINGPOOL_MAXPARTITIONCOUNT = int.MaxValue)
to pre-configure the
StringPool.Sharedparameters before initialization.DOTNET_SYSTEM_BUFFERS_SHAREDSTRINGPOOL_MAXSTRINGSPERPARTITION: Maximumstringsperpartition(default:256)DOTNET_SYSTEM_BUFFERS_SHAREDSTRINGPOOL_MAXPARTITIONCOUNT: Maximumpartitioncount (default:int.MaxValue, clamped toEnvironment.ProcessorCount)
⚠️ Has no effect after
StringPool.Sharedis initialized.
Note
⚠️ The actual length of the string rented from StringPool's Rent may not match the requested length.
- If you need the rented string’s actual length to equal the requested length,
- use
UnsafeString'spublic bool SetText(ReadOnlySpan<char> buffer), - and be sure to call
UnsafeString'spublic void Dispose().
⚠️ The string converted from UnsafeString:
- Does not guarantee the same lifetime or content consistency as the
UnsafeStringitself. - The safest practice is to update all
strings converted fromUnsafeStringevery time you update theUnsafeString.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 is compatible. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- System.Runtime.CompilerServices.Unsafe (>= 6.0.0)
-
net5.0
- No dependencies.
-
net6.0
- No dependencies.
-
net7.0
- No dependencies.
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.