feat: Adds a single threaded array pool (#967)

## Added Feature
Adds a single threaded array pool that works exactly the same as `ArrayPool<T>.Shared`.
The `STArrayPool<T>.Shared` can only be used on a single thread, the main game thread of the server.

Note: Unlike the built-in array pool, there is no hook into the _GC Gen 2_. This means to relieve potentially high memory pressure, `ArrayPool<T>.Shared.Trim()` must be called. The pool will only release arrays _after two successive calls within 10 seconds or longer_. If the server is at less than 70% total memory usage, or the server is not going to use this pool for something egregious, then don't bother ever calling Trim().


## Changes
- [X] Fixes ArrayPool calls that should be cleared due to references.
- [X] Benchmarks against ArrayPool with 4+ rented arrays deep of the same length.
- [x] Unit tests
This commit is contained in:
Kamron Batman 2022-03-22 09:58:24 -07:00 committed by GitHub
parent 0925a2d435
commit 76fddcbccd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 604 additions and 12 deletions

View file

@ -26,7 +26,9 @@ namespace Benchmarks
//var mapMobilesSelectors = BenchmarkRunner.Run<MapMobileSelectors>();
//var mapMultiTilesSelectors = BenchmarkRunner.Run<MapMultiTilesSelectors>();
//var mapMultiSelectors = BenchmarkRunner.Run<MapMultiSelectors>();
var mapItemsSelectors = BenchmarkRunner.Run<MapItemSelectors>();
// var mapItemsSelectors = BenchmarkRunner.Run<MapItemSelectors>();
// var stArray = BenchmarkRunner.Run<BenchmarkSTArray>();
var pooledRefQueue = BenchmarkRunner.Run<BenchmarkPooledRefQueue>();
}
}
}