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
ArrayPool
design, 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
ArrayPool
or manual caching lack dedicated support for string pooling. StringPool
provides 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
clearArray
is 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> buffer
into the internal buffer,returns
true
if a new buffer was rented,returns
false
if no new buffer was rented.You can use
public static implicit operator string?(UnsafeString? @string)
to convert anUnsafeString
to astring
,the string's
Length
will 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
StringPool
determines 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.Shared
parameters before initialization.DOTNET_SYSTEM_BUFFERS_SHAREDSTRINGPOOL_MAXSTRINGSPERPARTITION
: Maximumstrings
perpartition
(default:256
)DOTNET_SYSTEM_BUFFERS_SHAREDSTRINGPOOL_MAXPARTITIONCOUNT
: Maximumpartition
count (default:int.MaxValue
, clamped toEnvironment.ProcessorCount
)
⚠️ Has no effect after
StringPool.Shared
is 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
UnsafeString
itself. - The safest practice is to update all
string
s converted fromUnsafeString
every 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.