Skip to content
This repository has been archived by the owner on May 21, 2022. It is now read-only.

Commit

Permalink
Merge branch 'dev-pomma89'
Browse files Browse the repository at this point in the history
  • Loading branch information
pomma89 committed Oct 1, 2017
2 parents fc51f23 + 7b2fabd commit e37f812
Show file tree
Hide file tree
Showing 68 changed files with 4,914 additions and 291 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,9 @@ App_Data/*.ldf
artifacts
tools

# BenchmarkDotNet
BenchmarkDotNet.Artifacts

#############
## Windows detritus
#############
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog for CodeProject.ObjectPool #

### v3.2.1 (2017-09-30)

* Added an adapter for Microsoft.Extensions.ObjectPool.

### v3.2.0 (2017-08-16)

* Added support for .NET Standard 2.0.
Expand Down
41 changes: 41 additions & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<Project>
<PropertyGroup>
<VersionPrefix>3.2.1</VersionPrefix>
<AssemblyVersion>3.0.0</AssemblyVersion>
</PropertyGroup>

<PropertyGroup Label="NuGet">
<Authors>Ofir Makmal &lt;ofir.makmal@gmail.com&gt;;Alessio Parma &lt;alessio.parma@gmail.com&gt;</Authors>
<Copyright>Copyright (c) 2013 Ofir Makmal &lt;ofir.makmal@gmail.com&gt;</Copyright>
<PackageReleaseNotes>/~https://github.com/pomma89/ObjectPool/releases</PackageReleaseNotes>
<PackageIconUrl>http://pomma89.altervista.org/objectpool/logo-128.png</PackageIconUrl>
<PackageProjectUrl>/~https://github.com/pomma89/ObjectPool</PackageProjectUrl>
<PackageLicenseUrl>http://www.codeproject.com/info/cpol10.aspx</PackageLicenseUrl>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>/~https://github.com/pomma89/ObjectPool</RepositoryUrl>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard1.0' ">
<DefineConstants>$(DefineConstants);NETSTD10;LIBLOG_PORTABLE</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard1.2' ">
<DefineConstants>$(DefineConstants);NETSTD12;LIBLOG_PORTABLE</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
<DefineConstants>$(DefineConstants);NETSTD13;LIBLOG_PORTABLE</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
<DefineConstants>$(DefineConstants);NETSTD20</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net40' ">
<DefineConstants>$(DefineConstants);NET40;HAS_SERIALIZABLE</DefineConstants>
</PropertyGroup>

<PropertyGroup Condition=" '$(TargetFramework)' == 'net45' ">
<DefineConstants>$(DefineConstants);NET45;HAS_SERIALIZABLE</DefineConstants>
</PropertyGroup>
</Project>
10 changes: 9 additions & 1 deletion ObjectPool.sln
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26730.15
VisualStudioVersion = 15.0.26730.3
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "root", "root", "{4C2B7C0C-7CDD-4125-B57A-88E168D24190}"
ProjectSection(SolutionItems) = preProject
Expand All @@ -12,6 +12,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "root", "root", "{4C2B7C0C-7
build.cake = build.cake
CHANGELOG.md = CHANGELOG.md
config.wyam = config.wyam
Directory.Build.props = Directory.Build.props
LICENSE.htm = LICENSE.htm
NuGet.Config = NuGet.Config
pomma89.snk = pomma89.snk
Expand Down Expand Up @@ -45,6 +46,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{DA3DC42C
tools\packages.config = tools\packages.config
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeProject.ObjectPool.MicrosoftExtensionsAdapter", "src\CodeProject.ObjectPool.MicrosoftExtensionsAdapter\CodeProject.ObjectPool.MicrosoftExtensionsAdapter.csproj", "{1B2704CE-B3C5-4566-A932-C339E6BDD1CC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -67,6 +70,10 @@ Global
{362C2E4A-3EE7-41BE-A233-70649B258439}.Debug|Any CPU.Build.0 = Debug|Any CPU
{362C2E4A-3EE7-41BE-A233-70649B258439}.Release|Any CPU.ActiveCfg = Release|Any CPU
{362C2E4A-3EE7-41BE-A233-70649B258439}.Release|Any CPU.Build.0 = Release|Any CPU
{1B2704CE-B3C5-4566-A932-C339E6BDD1CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1B2704CE-B3C5-4566-A932-C339E6BDD1CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1B2704CE-B3C5-4566-A932-C339E6BDD1CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1B2704CE-B3C5-4566-A932-C339E6BDD1CC}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -77,6 +84,7 @@ Global
{9C66B27C-8424-4D2E-A033-612776D59202} = {69DFB95F-7861-4E90-ABC1-33F75FBE67AF}
{362C2E4A-3EE7-41BE-A233-70649B258439} = {69DFB95F-7861-4E90-ABC1-33F75FBE67AF}
{DA3DC42C-80E7-4559-9737-F13BE6F4565C} = {4C2B7C0C-7CDD-4125-B57A-88E168D24190}
{1B2704CE-B3C5-4566-A932-C339E6BDD1CC} = {750142DD-9B82-47CB-A2D5-71E4950843D2}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4C81698D-E18E-4669-B9D3-7FEFA57C794D}
Expand Down
122 changes: 73 additions & 49 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@

*A generic, concurrent, portable and flexible Object Pool for the .NET Framework, completely based on the [Code Project article of Ofir Makmal](http://www.codeproject.com/Articles/535735/Implementing-a-Generic-Object-Pool-in-NET).*

## Summary ##
## Summary

* Latest release version: `v3.2.0`
* Latest release version: `v3.2.1`
* Build status on [Travis CI](https://travis-ci.org): [![Build Status](https://travis-ci.org/pomma89/ObjectPool.svg?branch=master)](https://travis-ci.org/pomma89/ObjectPool)
* Build status on [AppVeyor](https://www.appveyor.com/): [![Build status](https://ci.appveyor.com/api/projects/status/cgldtxe3p9v7nf0i/branch/master?svg=true)](https://ci.appveyor.com/project/pomma89/objectpool/branch/master)
* [Doxygen](http://www.stack.nl/~dimitri/doxygen/index.html) documentation:
Expand All @@ -14,8 +14,9 @@
+ [PDF](http://pomma89.altervista.org/objectpool/doc/refman.pdf)
* [NuGet](https://www.nuget.org) package(s):
+ [CodeProject.ObjectPool](https://nuget.org/packages/CodeProject.ObjectPool/)
+ [CodeProject.ObjectPool.MicrosoftExtensionsAdapter](https://nuget.org/packages/CodeProject.ObjectPool.MicrosoftExtensionsAdapter/)

## Introduction ##
## Introduction

Library is production ready and it is successfully working in real life systems.

Expand All @@ -27,7 +28,6 @@ Many thanks to Ofir Makmal for his great work.

Quick and dirty example:


```cs
/// <summary>
/// Example usages of ObjectPool.
Expand Down Expand Up @@ -78,6 +78,23 @@ internal static class Program
Thread.Sleep(TimeSpan.FromSeconds(4));
Console.WriteLine($"Timed pool size after 4 seconds: {timedPool.ObjectsInPoolCount}"); // Should be 0
// Adapts a timed pool to Microsoft Extensions abstraction.
var mPool = ObjectPoolAdapter.CreateForPooledObject(timedPool);

// Sample usage of Microsoft pool.
var mResource = mPool.Get();
Debug.Assert(mResource is ExpensiveResource);
mPool.Return(mResource);

// Adapts a new pool to Microsoft Extensions abstraction. This example shows how to adapt
// when object type does not extend PooledObject.
var mPool2 = ObjectPoolAdapter.Create(new ObjectPool<PooledObjectWrapper<MemoryStream>>(() => PooledObjectWrapper.Create(new MemoryStream())));

// Sample usage of second Microsoft pool.
var mResource2 = mPool2.Get();
Debug.Assert(mResource2 is MemoryStream);
mPool2.Return(mResource2);

Console.Read();
}

Expand Down Expand Up @@ -127,77 +144,85 @@ internal sealed class ExternalExpensiveResource
}
```

## Benchmarks ##
## Benchmarks

All benchmarks were implemented and run using the wonderful [BenchmarkDotNet](/~https://github.com/dotnet/BenchmarkDotNet) library.

### [Retrieve one object](/~https://github.com/pomma89/ObjectPool/blob/master/test/CodeProject.ObjectPool.Benchmarks/RetrieveOneObject.cs) ###
### [Retrieve one object](/~https://github.com/pomma89/ObjectPool/blob/master/test/CodeProject.ObjectPool.Benchmarks/RetrieveOneObject.cs)

In this benchmark we evaluate how long it takes to extract and return an object stored into the pool, using a single thread. We compare four implementations:

* [This project's ObjectPool](/~https://github.com/pomma89/ObjectPool/blob/master/src/CodeProject.ObjectPool/ObjectPool.cs)
* [This project's ParameterizedObjectPool](/~https://github.com/pomma89/ObjectPool/blob/master/src/CodeProject.ObjectPool/ParameterizedObjectPool.cs)
* [Microsoft's ObjectPool](http://www.nuget.org/packages/Microsoft.Extensions.ObjectPool/)
* [Original ObjectPool](http://www.codeproject.com/Articles/535735/Implementing-a-Generic-Object-Pool-in-NET)
* [Microsoft's ObjectPool](http://www.nuget.org/packages/Microsoft.Extensions.ObjectPool/)
* [This project's adapter for Microsoft's ObjectPool](/~https://github.com/pomma89/ObjectPool/blob/master/src/CodeProject.ObjectPool.MicrosoftExtensionsAdapter/ObjectPoolAdapter.cs)

``` ini

BenchmarkDotNet=v0.10.3.0, OS=Microsoft Windows NT 6.2.9200.0
BenchmarkDotNet=v0.10.9, OS=Windows 10 Redstone 1 (10.0.14393)
Processor=AMD A10 Extreme Edition Radeon R8, 4C+8G, ProcessorCount=4
Frequency=1949466 Hz, Resolution=512.9610 ns, Timer=TSC
[Host] : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
RyuJitX64 : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
Frequency=1949467 Hz, Resolution=512.9607 ns, Timer=TSC
.NET Core SDK=2.0.0
[Host] : .NET Core 2.0.0 (Framework 4.6.00001.0), 64bit RyuJIT
RyuJitX64 : .NET Core 2.0.0 (Framework 4.6.00001.0), 64bit RyuJIT

Job=RyuJitX64 Jit=RyuJit Platform=X64

```
| Method | Mean | StdErr | StdDev | Median | Scaled | Scaled-StdDev | Gen 0 | Allocated |
|-------------- |-------------- |---------- |----------- |-------------- |------- |-------------- |------- |---------- |
| Simple | 121.7587 ns | 2.6138 ns | 9.7801 ns | 117.3474 ns | 1.00 | 0.00 | - | 0 B |
| Parameterized | 180.3051 ns | 0.4339 ns | 1.5644 ns | 180.0446 ns | 1.49 | 0.10 | 0.0331 | 24 B |
| Microsoft | 60.0949 ns | 0.7015 ns | 5.0583 ns | 57.2039 ns | 0.50 | 0.05 | - | 0 B |
| Original | 2,015.6827 ns | 8.4539 ns | 32.7417 ns | 2,023.0768 ns | 16.64 | 1.18 | - | 239 B |
| Method | Mean | Error | StdDev | Median | Scaled | ScaledSD | Gen 0 | Gen 1 | Allocated |
|----------------- |------------:|----------:|----------:|------------:|-------:|---------:|-------:|-------:|----------:|
| Simple | 235.58 ns | 4.935 ns | 10.729 ns | 237.90 ns | 1.00 | 0.00 | 0.1216 | - | 64 B |
| Parameterized | 334.42 ns | 6.966 ns | 20.211 ns | 340.66 ns | 1.42 | 0.11 | 0.1674 | - | 88 B |
| Original | 1,100.13 ns | 12.239 ns | 10.850 ns | 1,099.87 ns | 4.68 | 0.22 | 0.3399 | 0.0046 | 196 B |
| Microsoft | 79.35 ns | 1.791 ns | 2.329 ns | 79.92 ns | 0.34 | 0.02 | - | - | 0 B |
| AdaptedMicrosoft | 243.91 ns | 5.221 ns | 15.394 ns | 246.22 ns | 1.04 | 0.08 | 0.1216 | - | 64 B |

![](http://pomma89.altervista.org/objectpool/perf/RetrieveOneObject-barplot.png "Retrieve one object barplot")

### [Retrieve objects concurrently](/~https://github.com/pomma89/ObjectPool/blob/master/test/CodeProject.ObjectPool.Benchmarks/RetrieveObjectsConcurrently.cs) ###
### [Retrieve objects concurrently](/~https://github.com/pomma89/ObjectPool/blob/master/test/CodeProject.ObjectPool.Benchmarks/RetrieveObjectsConcurrently.cs)

In this benchmark we evaluate how long it takes to extract and return an object stored into the pool, using `Count` threads. We compare four implementations:

* [This project's ObjectPool](/~https://github.com/pomma89/ObjectPool/blob/master/src/CodeProject.ObjectPool/ObjectPool.cs)
* [This project's ParameterizedObjectPool](/~https://github.com/pomma89/ObjectPool/blob/master/src/CodeProject.ObjectPool/ParameterizedObjectPool.cs)
* [Microsoft's ObjectPool](http://www.nuget.org/packages/Microsoft.Extensions.ObjectPool/)
* [Original ObjectPool](http://www.codeproject.com/Articles/535735/Implementing-a-Generic-Object-Pool-in-NET)
* [Microsoft's ObjectPool](http://www.nuget.org/packages/Microsoft.Extensions.ObjectPool/)
* [This project's adapter for Microsoft's ObjectPool](/~https://github.com/pomma89/ObjectPool/blob/master/src/CodeProject.ObjectPool.MicrosoftExtensionsAdapter/ObjectPoolAdapter.cs)

``` ini

BenchmarkDotNet=v0.10.3.0, OS=Microsoft Windows NT 6.2.9200.0
BenchmarkDotNet=v0.10.9, OS=Windows 10 Redstone 1 (10.0.14393)
Processor=AMD A10 Extreme Edition Radeon R8, 4C+8G, ProcessorCount=4
Frequency=1949466 Hz, Resolution=512.9610 ns, Timer=TSC
[Host] : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
RyuJitX64 : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
Frequency=1949467 Hz, Resolution=512.9607 ns, Timer=TSC
.NET Core SDK=2.0.0
[Host] : .NET Core 2.0.0 (Framework 4.6.00001.0), 64bit RyuJIT
RyuJitX64 : .NET Core 2.0.0 (Framework 4.6.00001.0), 64bit RyuJIT

Job=RyuJitX64 Jit=RyuJit Platform=X64

```
| Method | Count | Mean | StdErr | StdDev | Scaled | Scaled-StdDev | Gen 0 | Gen 1 | Allocated |
|-------------- |------ |-------------- |----------- |----------- |------- |-------------- |-------- |-------- |---------- |
| **Simple** | **10** | **12.5464 us** | **0.0161 us** | **0.0559 us** | **1.00** | **0.00** | **2.0091** | **-** | **1.15 kB** |
| Parameterized | 10 | 14.6937 us | 0.1460 us | 0.8758 us | 1.17 | 0.07 | 2.4578 | - | 1.43 kB |
| Microsoft | 10 | 9.9922 us | 0.0994 us | 0.9325 us | 0.80 | 0.07 | 1.8722 | - | 1.12 kB |
| Original | 10 | 27.0116 us | 0.1161 us | 0.4184 us | 2.15 | 0.03 | - | - | 3.72 kB |
| **Simple** | **100** | **69.6033 us** | **0.4120 us** | **1.4271 us** | **1.00** | **0.00** | **0.0163** | **-** | **1.47 kB** |
| Parameterized | 100 | 78.6620 us | 0.6899 us | 2.3897 us | 1.13 | 0.04 | 6.0963 | - | 3.92 kB |
| Microsoft | 100 | 33.5158 us | 0.3347 us | 2.5710 us | 0.48 | 0.04 | 4.1996 | 0.7410 | 2.42 kB |
| Original | 100 | 177.8085 us | 0.8120 us | 3.1450 us | 2.56 | 0.07 | 3.6719 | - | 27.01 kB |
| **Simple** | **1000** | **800.4478 us** | **1.4427 us** | **5.2017 us** | **1.00** | **0.00** | **-** | **-** | **4.75 kB** |
| Parameterized | 1000 | 847.4692 us | 2.5917 us | 10.0377 us | 1.06 | 0.01 | 31.3802 | - | 27.91 kB |
| Microsoft | 1000 | 367.3571 us | 3.6502 us | 28.0380 us | 0.46 | 0.03 | 53.3482 | 10.9933 | 33.35 kB |
| Original | 1000 | 1,447.6767 us | 22.5522 us | 84.3827 us | 1.81 | 0.10 | - | - | 267.77 kB |
| Method | Count | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Gen 1 | Allocated |
|----------------- |------ |------------:|-----------:|-----------:|-------:|---------:|---------:|--------:|----------:|
| **Simple** | **10** | **16.20 us** | **0.3121 us** | **0.4166 us** | **1.00** | **0.00** | **4.9215** | **-** | **2.35 KB** |
| Parameterized | 10 | 16.04 us | 0.2204 us | 0.2062 us | 0.99 | 0.03 | 5.6030 | - | 2.56 KB |
| Original | 10 | 18.60 us | 0.1700 us | 0.1420 us | 1.15 | 0.03 | 7.6222 | - | 3 KB |
| Microsoft | 10 | 14.04 us | 0.2648 us | 0.2211 us | 0.87 | 0.03 | 3.6167 | - | 1.74 KB |
| AdaptedMicrosoft | 10 | 15.80 us | 0.2689 us | 0.2099 us | 0.98 | 0.03 | 5.0049 | - | 2.35 KB |
| **Simple** | **100** | **66.00 us** | **1.2006 us** | **1.0643 us** | **1.00** | **0.00** | **16.6273** | **-** | **4.75 KB** |
| Parameterized | 100 | 84.03 us | 1.6033 us | 1.5746 us | 1.27 | 0.03 | 21.5088 | - | 5.09 KB |
| Original | 100 | 133.08 us | 1.0699 us | 1.0008 us | 2.02 | 0.03 | 43.2617 | - | 14.15 KB |
| Microsoft | 100 | 32.72 us | 0.6511 us | 0.6395 us | 0.50 | 0.01 | 5.3711 | 0.9359 | 1.87 KB |
| AdaptedMicrosoft | 100 | 74.85 us | 1.4805 us | 2.3908 us | 1.13 | 0.04 | 16.5876 | - | 4.66 KB |
| **Simple** | **1000** | **756.57 us** | **4.9338 us** | **4.6151 us** | **1.00** | **0.00** | **128.0599** | **-** | **19.8 KB** |
| Parameterized | 1000 | 499.51 us | 3.4858 us | 2.7215 us | 0.66 | 0.01 | 174.9349 | - | 25.92 KB |
| Original | 1000 | 1,222.56 us | 12.8086 us | 11.9812 us | 1.62 | 0.02 | 337.2396 | 9.3750 | 101.38 KB |
| Microsoft | 1000 | 428.70 us | 8.3805 us | 8.6061 us | 0.57 | 0.01 | 48.0572 | 15.8991 | 4.12 KB |
| AdaptedMicrosoft | 1000 | 824.49 us | 6.4987 us | 6.0789 us | 1.09 | 0.01 | 128.0599 | - | 19.67 KB |

![](http://pomma89.altervista.org/objectpool/perf/RetrieveObjectsConcurrently-barplot.png "Retrieve objects concurrently barplot")

### [Memory stream pooling](/~https://github.com/pomma89/ObjectPool/blob/master/test/CodeProject.ObjectPool.Benchmarks/MemoryStreamPooling.cs) ###
### [Memory stream pooling](/~https://github.com/pomma89/ObjectPool/blob/master/test/CodeProject.ObjectPool.Benchmarks/MemoryStreamPooling.cs)

In this benchmark we evaluate how long it takes to extract and return a memory stream stored into the pool, using a single thread. We compare two implementations:

Expand All @@ -206,26 +231,25 @@ In this benchmark we evaluate how long it takes to extract and return a memory s

``` ini

BenchmarkDotNet=v0.10.3.0, OS=Microsoft Windows NT 6.2.9200.0
BenchmarkDotNet=v0.10.9, OS=Windows 10 Redstone 1 (10.0.14393)
Processor=AMD A10 Extreme Edition Radeon R8, 4C+8G, ProcessorCount=4
Frequency=1949466 Hz, Resolution=512.9610 ns, Timer=TSC
[Host] : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
RyuJitX64 : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
Frequency=1949467 Hz, Resolution=512.9607 ns, Timer=TSC
.NET Core SDK=2.0.0
[Host] : .NET Core 2.0.0 (Framework 4.6.00001.0), 64bit RyuJIT
RyuJitX64 : .NET Core 2.0.0 (Framework 4.6.00001.0), 64bit RyuJIT

Job=RyuJitX64 Jit=RyuJit Platform=X64

```
| Method | Mean | StdDev | Scaled | Scaled-StdDev | Gen 0 | Allocated |
|------------------------------ |-------------- |----------- |------- |-------------- |------- |---------- |
| MemoryStreamPool | 173.8324 ns | 5.5788 ns | 1.00 | 0.00 | - | 0 B |
| RecyclableMemoryStreamManager | 3,406.0877 ns | 88.6058 ns | 19.61 | 0.76 | 0.7796 | 448 B |
| Method | Mean | Error | StdDev | Scaled | ScaledSD | Gen 0 | Allocated |
|------------------------------ |-----------:|----------:|----------:|-------:|---------:|-------:|----------:|
| MemoryStreamPool | 360.4 ns | 7.187 ns | 14.68 ns | 1.00 | 0.00 | 0.1216 | 64 B |
| RecyclableMemoryStreamManager | 4,207.3 ns | 85.152 ns | 251.07 ns | 11.69 | 0.84 | 0.8469 | 448 B |

![](http://pomma89.altervista.org/objectpool/perf/MemoryStreamPooling-barplot.png "Memory stream pooling barplot")

## About this repository and its maintainer ##
## About this repository and its maintainer

Everything done on this repository is freely offered on the terms of the project license. You are free to do everything you want with the code and its related files, as long as you respect the license and use common sense while doing it :-)

I maintain this project during my spare time, so I can offer limited assistance and I can offer **no kind of warranty**.

Development of this project is sponsored by [Finsa SpA](https://www.finsa.it), my current employer.
2 changes: 1 addition & 1 deletion appveyor.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version: 3.2.0.{build}
version: 3.2.1.{build}
image: Visual Studio 2017
build_script:
- ps: .\build.ps1
Expand Down
Loading

0 comments on commit e37f812

Please sign in to comment.