public void RentReturnPinnedSlicesRetainablePool() { var maxBuffers = 128 / 64; // 2 var pool = new RetainableMemoryPool <byte>(null, 32 * 1024, 1024 * 1024, maxBuffers, 0); var list = new List <RetainableMemory <byte> >(); using (Benchmark.Run("FullCycle")) { for (int i = 0; i < maxBuffers * 2; i++) { list.Add(pool.RentMemory(64 * 1024)); } for (int i = 0; i < maxBuffers; i++) { ((IDisposable)list[i]).Dispose(); } for (int i = 2; i < maxBuffers * 2; i++) { pool.ReturnInternal(list[i]); } } pool.Dispose(); }
public void RefCountOfPooled() { var pool = new RetainableMemoryPool <byte>(null, 16, 1024 * 1024, 50, 2); var buf = (ArrayMemory <byte>)pool.Rent(100); Assert.IsTrue(buf.IsPoolable); Console.WriteLine($"rented: {buf.ReferenceCount}"); pool.ReturnInternal(buf); Assert.IsTrue(buf.IsDisposed); Assert.IsTrue(buf.IsPooled); Console.WriteLine($"returned: {buf.ReferenceCount}"); Console.WriteLine($"pooled: {buf.IsPooled}"); Assert.Throws <ObjectDisposedException>(() => { var _ = buf.Retain(); }); pool.Dispose(); }
public void RentReturnBenchmarkRetainablePoolOverCapacity() { #if !DEBUG var count = 10_000; #else var count = 1_000; #endif var capacity = 25; var batch = capacity * 2; var pool = new RetainableMemoryPool <byte>(ArrayMemory <byte> .Create, 16, 1024 * 1024, capacity, 0); var list = new List <RetainableMemory <byte> >(batch); using (Benchmark.Run("FullCycle", count * batch)) { for (int i = 0; i < count; i++) { for (int j = 0; j < batch; j++) { list.Add(pool.RentMemory(32 * 1024)); } foreach (var arrayMemory in list) { pool.ReturnInternal(arrayMemory); } list.Clear(); } } pool.Dispose(); }
public void ConcurrentRentReturn() { #if !DEBUG var count = 100_000_000; #else var count = 1_000; #endif var pool = new RetainableMemoryPool <byte>(null, 16, 1024 * 1024, 50, 2); var tasks = new List <Task>(); var taskCount = 1; // 6x2 cores var mre = new ManualResetEventSlim(false); Action action = () => { mre.Wait(); for (int i = 0; i < count; i++) { // ReSharper disable once AccessToDisposedClosure var memory = pool.RentMemory(32 * 1024); //(memory.Pin(0)).Dispose(); //if (memory.IsDisposed || memory.IsRetained) //{ // Assert.Fail(); //} // ReSharper disable once AccessToDisposedClosure pool.ReturnInternal(memory); //if (i % 1000000 == 0) //{ // Console.WriteLine(i); //} } }; for (int i = 0; i < taskCount; i++) { tasks.Add(Task.Run(action)); } //Console.WriteLine("Set affinity and press enter"); //Console.ReadLine(); using (Benchmark.Run("FullCycle", count * taskCount)) { mre.Set(); Task.WhenAll(tasks).Wait(); } pool.Dispose(); }
public void CouldDisposePoolWithFreeSpace() { var maxBuffers = 10; var pool = new RetainableMemoryPool <byte>(null, 32 * 1024, 1024 * 1024, maxBuffers, 0); using (Benchmark.Run("FullCycle")) { for (int i = 0; i < maxBuffers / 2; i++) { var memory = pool.RentMemory(64 * 1024); pool.ReturnInternal(memory); } } pool.Dispose(); }