diff --git a/src/ImageSharp/Memory/ArrayPoolMemoryManager.cs b/src/ImageSharp/Memory/ArrayPoolMemoryManager.cs index c4ce7d299..7a3adfb53 100644 --- a/src/ImageSharp/Memory/ArrayPoolMemoryManager.cs +++ b/src/ImageSharp/Memory/ArrayPoolMemoryManager.cs @@ -1,4 +1,5 @@ using System.Buffers; +using System.Runtime.InteropServices; namespace SixLabors.ImageSharp.Memory { @@ -7,9 +8,30 @@ namespace SixLabors.ImageSharp.Memory /// public class ArrayPoolMemoryManager : MemoryManager { + private readonly int minSizeBytes; + + /// + /// Initializes a new instance of the class. + /// By passing an integer greater than 0 as , a + /// minimum threshold for pooled allocations is set. Any allocation requests that + /// would require less size than the threshold will not be managed within the array pool. + /// + /// + /// Minimum size, in bytes, before an array pool is used to satisfy the request. + /// + public ArrayPoolMemoryManager(int minSizeBytes = 0) + { + this.minSizeBytes = minSizeBytes; + } + /// internal override Buffer Allocate(int size, bool clear = false) { + if (this.minSizeBytes > 0 && size < this.minSizeBytes * SizeHelper.Size) + { + return new Buffer(new T[size], size); + } + var buffer = new Buffer(PixelDataPool.Rent(size), size, this); if (clear) { @@ -24,5 +46,19 @@ namespace SixLabors.ImageSharp.Memory { PixelDataPool.Return(buffer.Array); } + + internal static class SizeHelper + { + static SizeHelper() + { + #if NETSTANDARD1_1 + Size = Marshal.SizeOf(typeof(T)); + #else + Size = Marshal.SizeOf(); + #endif + } + + public static int Size { get; } + } } } \ No newline at end of file diff --git a/src/ImageSharp/Memory/MemoryManager.cs b/src/ImageSharp/Memory/MemoryManager.cs index 38e68e22c..b68a01feb 100644 --- a/src/ImageSharp/Memory/MemoryManager.cs +++ b/src/ImageSharp/Memory/MemoryManager.cs @@ -14,7 +14,7 @@ namespace SixLabors.ImageSharp.Memory /// /// Gets or sets the that is currently in use. /// - public static MemoryManager Current { get; set; } = new ArrayPoolMemoryManager(); + public static MemoryManager Current { get; set; } = new ArrayPoolMemoryManager(1024 * 80); /// /// Allocates a of size , optionally diff --git a/src/ImageSharp/Memory/NullMemoryManager.cs b/src/ImageSharp/Memory/NullMemoryManager.cs new file mode 100644 index 000000000..32642dae4 --- /dev/null +++ b/src/ImageSharp/Memory/NullMemoryManager.cs @@ -0,0 +1,19 @@ +namespace SixLabors.ImageSharp.Memory +{ + /// + /// Implements by allocating new buffers on every call. + /// + public class NullMemoryManager : MemoryManager + { + /// + internal override Buffer Allocate(int size, bool clear = false) + { + return new Buffer(new T[size], size); + } + + /// + internal override void Release(Buffer buffer) + { + } + } +}