Esempio n. 1
0
        public void OffHeapPoolCannotDisposeRetained()
        {
            var pool          = new OffHeapMemoryPool <byte>(1);
            var offHeapMemory = pool.RentMemory(32 * 1024);
            var rm            = offHeapMemory.Retain();

            Assert.Throws <InvalidOperationException>(() => { pool.Return(offHeapMemory); });
            rm.Dispose();
            pool.Dispose();
        }
Esempio n. 2
0
        public void OffHeapPoolCouldRentReturn()
        {
            var pool           = new OffHeapMemoryPool <byte>(2);
            var offHeapMemory  = pool.RentMemory(32 * 1024);
            var offHeapMemory2 = pool.RentMemory(32 * 1024);

            pool.Return(offHeapMemory);
            pool.Return(offHeapMemory2);
            Assert.AreEqual(2, pool.InspectObjects().Count());
            pool.Dispose();
        }
Esempio n. 3
0
        public void OffHeapPoolRetainDisposePerformance()
        {
#pragma warning disable 618
            Settings.DoAdditionalCorrectnessChecks = false;
#pragma warning restore 618

            var sizesKb = new[] { 32, 64, 128, 256, 512, 1024, 2048, 4096 };
            var count   = 5_000_000;
            var maxSize = 4096 * 1024;
            var pool    = new OffHeapMemoryPool <byte>(2, maxSize);

            // warmup
            foreach (var size in sizesKb)
            {
                for (int i = 0; i < 1; i++)
                {
                    var offHeapMemory = pool.RentMemory(size * 1024);
                    pool.Return(offHeapMemory);
                }
            }

            foreach (var size in sizesKb)
            {
                if (size * 1024 > maxSize)
                {
                    using (Benchmark.Run(size + " kb, KOPS", count))
                    {
                        for (int i = 0; i < count / 1_000; i++)
                        {
                            var rm = pool.RentMemory(size * 1024).Retain();
                            rm.Dispose();
                        }
                    }
                }
                else
                {
                    using (Benchmark.Run(size + " kb", count))
                    {
                        for (int i = 0; i < count; i++)
                        {
                            var rm = pool.RentMemory(size * 1024).Retain();
                            rm.Dispose();
                        }
                    }
                }
            }

            Benchmark.Dump();

            Assert.AreEqual(1, pool.InspectObjects().Count());
        }
Esempio n. 4
0
        public void CouldDisposeNonPooledBuffer()
        {
            var pool = new OffHeapMemoryPool <byte>(2);

            var buffer = new OffHeapMemory <byte>(1000);

            Assert.Throws <InvalidOperationException>(() => { buffer.Unpin(); });

            Assert.Throws <InvalidOperationException>(() => { pool.Return(buffer); });

            ((IDisposable)buffer).Dispose();

            Assert.Throws <ObjectDisposedException>(() => { ((IDisposable)buffer).Dispose(); });
        }
Esempio n. 5
0
        public void OffHeapPoolCouldRentReturnWithOverCapacity()
        {
            var pool           = new OffHeapMemoryPool <byte>(2);
            var offHeapMemory  = pool.RentMemory(32 * 1024);
            var offHeapMemory2 = pool.RentMemory(32 * 1024);
            var offHeapMemory3 = pool.RentMemory(32 * 1024);

            ((IDisposable)offHeapMemory).Dispose();
            ((IDisposable)offHeapMemory2).Dispose();
            ((IDisposable)offHeapMemory3).Dispose();

            Assert.Throws <InvalidOperationException>(() => { pool.Return(offHeapMemory); });
            Assert.Throws <InvalidOperationException>(() => { pool.Return(offHeapMemory2); });
            Assert.Throws <ObjectDisposedException>(() => { pool.Return(offHeapMemory3); });
            Assert.AreEqual(2, pool.InspectObjects().Count());
        }
Esempio n. 6
0
        public void OffHeapPoolCouldRentReturnWithOverCapacity()
        {
            var pool           = new OffHeapMemoryPool <byte>(2);
            var offHeapMemory  = pool.RentMemory(32 * 1024);
            var offHeapMemory2 = pool.RentMemory(32 * 1024);
            var offHeapMemory3 = pool.RentMemory(32 * 1024);

            Assert.AreEqual(pool.PoolIdx, offHeapMemory3._poolIdx, "pool idx of newlly allocated");

            ((IDisposable)offHeapMemory).Dispose();
            ((IDisposable)offHeapMemory2).Dispose();
            ((IDisposable)offHeapMemory3).Dispose();

            Assert.Throws <ObjectDisposedException>(() => { pool.ReturnInternal(offHeapMemory); });
            Assert.Throws <ObjectDisposedException>(() => { pool.ReturnInternal(offHeapMemory2); });
            Assert.Throws <ObjectDisposedException>(() => { pool.ReturnInternal(offHeapMemory3); });
            Assert.AreEqual(2, pool.InspectObjects().Count());
        }
Esempio n. 7
0
        public void OffHeapPoolCouldDisposeRented()
        {
            var pool          = new OffHeapMemoryPool <byte>(2);
            var offHeapMemory = pool.RentMemory(32 * 1024);

            ((IDisposable)offHeapMemory).Dispose();

            Assert.Throws <InvalidOperationException>(() => { pool.Return(offHeapMemory); });

            Assert.AreEqual(1, pool.InspectObjects().Count());

            var rm = pool.RentMemory(32 * 1024).Retain();

            // ((IDisposable)offHeapMemory).Dispose();
            rm.Dispose();
            Assert.AreEqual(1, pool.InspectObjects().Count());

            pool.Dispose();
        }
Esempio n. 8
0
        public void OffHeapPoolRentReturnPerformance()
        {
#pragma warning disable 618
            Settings.DoAdditionalCorrectnessChecks = false; // no difference
#pragma warning restore 618

            var sizes = new[] { Settings.LARGE_BUFFER_LIMIT / 8, Settings.LARGE_BUFFER_LIMIT / 4, Settings.LARGE_BUFFER_LIMIT / 2, Settings.LARGE_BUFFER_LIMIT / 1, Settings.LARGE_BUFFER_LIMIT * 2 };
            var count = 1_000;

            var pool = new OffHeapMemoryPool <byte>(2);

            // warmup
            foreach (var size in sizes)
            {
                for (int i = 0; i < 1; i++)
                {
                    var offHeapMemory = pool.RentMemory(size);
                    pool.ReturnInternal(offHeapMemory);
                }
            }

            foreach (var size in sizes)
            {
                using (Benchmark.Run(size + " kb", count))
                {
                    for (int i = 0; i < count; i++)
                    {
                        var offHeapMemory = pool.RentMemory(size);
                        pool.ReturnInternal(offHeapMemory);
                    }
                }
            }

            Benchmark.Dump();

            var objs = pool.InspectObjects().ToArray();

            Assert.AreEqual(2, objs.Count());
        }
Esempio n. 9
0
        public void OffHeapPoolRentReturnPerformance()
        {
#pragma warning disable 618
            Settings.DoAdditionalCorrectnessChecks = false; // no difference
#pragma warning restore 618

            var sizesKb = new[] { 32, 64, 128, 256, 512, 1024, 2048, 4096 };
            var count   = 10_000_000;

            var pool = new OffHeapMemoryPool <byte>(2);

            // warmup
            foreach (var size in sizesKb)
            {
                for (int i = 0; i < 1; i++)
                {
                    var offHeapMemory = pool.RentMemory(size * 1024);
                    pool.Return(offHeapMemory);
                }
            }

            foreach (var size in sizesKb)
            {
                using (Benchmark.Run(size + " kb", count))
                {
                    for (int i = 0; i < count; i++)
                    {
                        var offHeapMemory = pool.RentMemory(size * 1024);
                        pool.Return(offHeapMemory);
                    }
                }
            }

            Benchmark.Dump();

            Assert.AreEqual(1, pool.InspectObjects().Count());
        }