Skip to content

Commit cd46dab

Browse files
author
Oren (electricessence)
committed
Updates and fixes.
Added ConcurrentQueueObjectPool as it's the overall winner. Fixed missing pool array for the array pools. :P Added notes to code. Regenerated updated reports.
1 parent 82ed41b commit cd46dab

7 files changed

Lines changed: 238 additions & 198 deletions

File tree

benchmarking/Benchmark.cs

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Concurrent;
44
using System.Collections.Generic;
55
using System.Diagnostics;
6+
using System.Linq;
67
using System.Threading.Tasks;
78

89
namespace Open.Disposable.ObjectPools
@@ -12,48 +13,35 @@ public class Benchmark<T> : BenchmarkBase<Func<IObjectPool<T>>>
1213
{
1314
public Benchmark(uint size, uint repeat, Func<IObjectPool<T>> poolFactory) : base(size,repeat,poolFactory)
1415
{
16+
// Because some pools do comparison checks on values, we have have unique instances/values.
17+
_items = new T[(int)size];
1518
}
1619

20+
readonly T[] _items;
1721

1822
protected override IEnumerable<TimedResult> TestOnceInternal()
1923
{
20-
var disposeTimer = new Stopwatch();
21-
using (var pool = TimedResult.Measure(out TimedResult constructionTime, "Pool Construction", Param))
24+
using (var pool = Param())
2225
{
23-
// yield return constructionTime; // Looking for anomalies.
24-
25-
// Indicates how long pure construction takes. The baseline by which you should measure .Take()
26-
//yield return TimedResult.Measure("02) Pool.Generate() (In Parallel)", () =>
27-
//{
28-
// Parallel.For(0, TestSize, i => pool.Generate());
29-
//});
30-
31-
var tank = new ConcurrentBag<T>(); // This will have an effect on performance measurement, but hopefully consistently.
3226

3327
yield return TimedResult.Measure("Take From Empty (In Parallel)", () =>
3428
{
35-
Parallel.For(0, TestSize, i => tank.Add(pool.Take()));
29+
Parallel.For(0, TestSize, i => _items[i] = pool.Take());
3630
});
3731

38-
// Put extra in the tank.
39-
for (var i = 0; i < TestSize; i++)
40-
{
41-
tank.Add(pool.Generate());
42-
}
43-
4432
yield return TimedResult.Measure("Give To (In Parallel)", () =>
4533
{
46-
Parallel.ForEach(tank, e => pool.Give(e));
34+
Parallel.For(0, TestSize, i => pool.Give(_items[i]));
4735
});
4836

4937
yield return TimedResult.Measure("Mixed Read/Write (In Parallel)", () =>
5038
{
5139
Parallel.For(0, TestSize, i =>
5240
{
5341
if (i % 2 == 0)
54-
tank.Add(pool.Take());
55-
else if (tank.TryTake(out T value))
56-
pool.Give(value);
42+
_items[i] = pool.Take();
43+
else
44+
pool.Give(_items[i]);
5745
});
5846
});
5947

@@ -63,12 +51,7 @@ protected override IEnumerable<TimedResult> TestOnceInternal()
6351
// remaining++;
6452
}
6553
});
66-
67-
disposeTimer.Start();
6854
}
69-
disposeTimer.Stop();
70-
71-
// yield return new TimedResult("98) Pool Disposal", disposeTimer); // Looking for anomalies.
7255
}
7356

7457
public static TimedResult[] Results(uint size, uint repeat, Func<IObjectPool<T>> poolFactory)

benchmarking/BenchmarkResult.csv

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,34 @@
11
Batch,Pool Type," From Empty (In Parallel)"," To (In Parallel)",d Read/Write (In Parallel),y Pool (.TryTake()),L,
2-
Repeat 100000 for size 4,QueueObjectPool,00:00:00.5503292,00:00:00.8699301,00:00:00.5049023,00:00:00.0856064,00:00:02.0107680,
3-
Repeat 100000 for size 4,OptimisticArrayObjectPool,00:00:00.4945329,00:00:00.7651863,00:00:00.4463578,00:00:00.0119882,00:00:01.7180652,
4-
Repeat 100000 for size 4,InterlockedArrayObjectPool,00:00:00.5031430,00:00:00.7350149,00:00:00.4426274,00:00:00.0118748,00:00:01.6926601,
5-
Repeat 40000 for size 10,QueueObjectPool,00:00:00.3394569,00:00:00.6304407,00:00:00.3237942,00:00:00.0814109,00:00:01.3751027,
6-
Repeat 40000 for size 10,OptimisticArrayObjectPool,00:00:00.3186967,00:00:00.5760139,00:00:00.3100712,00:00:00.0062692,00:00:01.2110510,
7-
Repeat 40000 for size 10,InterlockedArrayObjectPool,00:00:00.3348942,00:00:00.6268985,00:00:00.2893747,00:00:00.0064611,00:00:01.2576285,
8-
Repeat 8000 for size 100,QueueObjectPool,00:00:00.1821893,00:00:01.8153400,00:00:00.4279985,00:00:00.1419409,00:00:02.5674687,
9-
Repeat 8000 for size 100,OptimisticArrayObjectPool,00:00:00.1609254,00:00:00.7228674,00:00:00.1427258,00:00:00.0014514,00:00:01.0279700,
10-
Repeat 8000 for size 100,InterlockedArrayObjectPool,00:00:00.1513794,00:00:00.6657359,00:00:00.1681746,00:00:00.0014665,00:00:00.9867564,
11-
Repeat 6400 for size 250,QueueObjectPool,00:00:00.2343879,00:00:01.4150413,00:00:00.5851907,00:00:00.2314512,00:00:02.4660711,
12-
Repeat 6400 for size 250,OptimisticArrayObjectPool,00:00:00.2480108,00:00:01.0672955,00:00:00.2179887,00:00:00.0011457,00:00:01.5344407,
13-
Repeat 6400 for size 250,InterlockedArrayObjectPool,00:00:00.2914094,00:00:01.0667820,00:00:00.2011109,00:00:00.0011908,00:00:01.5604931,
14-
Repeat 2400 for size 1000,QueueObjectPool,00:00:00.2523175,00:00:01.4711696,00:00:00.4401825,00:00:00.3126743,00:00:02.4763439,
15-
Repeat 2400 for size 1000,OptimisticArrayObjectPool,00:00:00.2385401,00:00:00.9280943,00:00:00.2076219,00:00:00.0004635,00:00:01.3747198,
16-
Repeat 2400 for size 1000,InterlockedArrayObjectPool,00:00:00.2201321,00:00:00.9140866,00:00:00.2115462,00:00:00.0004777,00:00:01.3462426,
17-
Repeat 1600 for size 2000,QueueObjectPool,00:00:00.2841581,00:00:01.5477348,00:00:00.5331207,00:00:00.4086746,00:00:02.7736882,
18-
Repeat 1600 for size 2000,OptimisticArrayObjectPool,00:00:00.2867832,00:00:00.8624012,00:00:00.2330620,00:00:00.0002463,00:00:01.3824927,
19-
Repeat 1600 for size 2000,InterlockedArrayObjectPool,00:00:00.3151729,00:00:00.9199907,00:00:00.2395540,00:00:00.0002508,00:00:01.4749684,
20-
Repeat 1200 for size 4000,QueueObjectPool,00:00:00.4418864,00:00:02.3322869,00:00:00.7245495,00:00:00.6103612,00:00:04.1090840,
21-
Repeat 1200 for size 4000,OptimisticArrayObjectPool,00:00:00.4238313,00:00:01.3933130,00:00:00.2942627,00:00:00.0001992,00:00:02.1116062,
22-
Repeat 1200 for size 4000,InterlockedArrayObjectPool,00:00:00.4166768,00:00:01.4121809,00:00:00.3118676,00:00:00.0001992,00:00:02.1409245,
23-
Repeat 1600 for size 2000,QueueObjectPool,00:00:00.2797688,00:00:01.5554051,00:00:00.6034681,00:00:00.4108724,00:00:02.8495144,
24-
Repeat 1600 for size 2000,OptimisticArrayObjectPool,00:00:00.2842929,00:00:00.9583302,00:00:00.2346078,00:00:00.0002284,00:00:01.4774593,
25-
Repeat 1600 for size 2000,InterlockedArrayObjectPool,00:00:00.3133074,00:00:00.8566891,00:00:00.2569553,00:00:00.0002253,00:00:01.4271771,
26-
Repeat 1200 for size 4000,LinkedListObjectPool,00:00:01.1456541,00:00:04.5720859,00:00:01.2698255,00:00:00.6735988,00:00:07.6611643,
27-
Repeat 1200 for size 4000,QueueObjectPool,00:00:00.4444606,00:00:02.3798676,00:00:00.7691414,00:00:00.6140109,00:00:04.2074805,
28-
Repeat 1200 for size 4000,OptimisticArrayObjectPool,00:00:00.4147611,00:00:01.3839442,00:00:00.3031743,00:00:00.0001707,00:00:02.1020503,
29-
Repeat 1200 for size 4000,InterlockedArrayObjectPool,00:00:00.3761099,00:00:01.4896086,00:00:00.3215933,00:00:00.0001772,00:00:02.1874890,
2+
Repeat 200000 for size 4,QueueObjectPool,00:00:00.8239435,00:00:00.7659438,00:00:00.7539503,00:00:00.0915139,00:00:02.4353515,
3+
Repeat 200000 for size 4,ConcurrentQueueObjectPool,00:00:00.8454852,00:00:00.8014094,00:00:00.7777634,00:00:00.0943980,00:00:02.5190560,
4+
Repeat 200000 for size 4,OptimisticArrayObjectPool,00:00:00.7514263,00:00:00.6102573,00:00:00.6096008,00:00:00.0250278,00:00:01.9963122,
5+
Repeat 80000 for size 10,QueueObjectPool,00:00:00.4331560,00:00:00.4100775,00:00:00.3880329,00:00:00.0806808,00:00:01.3119472,
6+
Repeat 80000 for size 10,ConcurrentQueueObjectPool,00:00:00.4329151,00:00:00.4102398,00:00:00.4300915,00:00:00.0956072,00:00:01.3688536,
7+
Repeat 80000 for size 10,OptimisticArrayObjectPool,00:00:00.4835332,00:00:00.3670787,00:00:00.3804679,00:00:00.0163851,00:00:01.2474649,
8+
Repeat 24000 for size 50,QueueObjectPool,00:00:00.2038919,00:00:00.4452561,00:00:00.2320728,00:00:00.1154980,00:00:00.9967188,
9+
Repeat 24000 for size 50,ConcurrentQueueObjectPool,00:00:00.1995862,00:00:00.2350584,00:00:00.2086107,00:00:00.1473526,00:00:00.7906079,
10+
Repeat 24000 for size 50,OptimisticArrayObjectPool,00:00:00.3295805,00:00:00.1578376,00:00:00.1925929,00:00:00.0135767,00:00:00.6935877,
11+
Repeat 16000 for size 100,QueueObjectPool,00:00:00.1852586,00:00:00.9325604,00:00:00.3417127,00:00:00.1384648,00:00:01.5979965,
12+
Repeat 16000 for size 100,ConcurrentQueueObjectPool,00:00:00.1971318,00:00:00.2221067,00:00:00.1930569,00:00:00.1769435,00:00:00.7892389,
13+
Repeat 16000 for size 100,OptimisticArrayObjectPool,00:00:00.4016048,00:00:00.1306689,00:00:00.1996246,00:00:00.0152044,00:00:00.7471027,
14+
Repeat 25600 for size 250,QueueObjectPool,00:00:00.4788340,00:00:02.5027144,00:00:02.0335266,00:00:00.4868144,00:00:05.5018894,
15+
Repeat 25600 for size 250,ConcurrentQueueObjectPool,00:00:00.4744855,00:00:00.6086463,00:00:00.5306288,00:00:00.6649206,00:00:02.2786812,
16+
Repeat 25600 for size 250,OptimisticArrayObjectPool,00:00:02.4850059,00:00:00.2867497,00:00:00.7016053,00:00:00.0496239,00:00:03.5229848,
17+
Repeat 9600 for size 1000,QueueObjectPool,00:00:00.4068512,00:00:02.3780043,00:00:01.7465435,00:00:00.6397193,00:00:05.1711183,
18+
Repeat 9600 for size 1000,ConcurrentQueueObjectPool,00:00:00.4151344,00:00:00.6236454,00:00:00.5478473,00:00:00.8236824,00:00:02.4103095,
19+
Repeat 9600 for size 1000,OptimisticArrayObjectPool,00:00:12.1866684,00:00:00.2235276,00:00:01.1323710,00:00:00.0608345,00:00:13.6034015,
20+
0:02.6057931,
21+
Repeat 9600 for size 1000,OptimisticArrayObjectPool,00:00:00.4008469,00:00:00.2035019,00:00:00.3460404,00:00:00.0013505,00:00:00.9517397,
22+
Repeat 9600 for size 1000,InterlockedArrayObjectPool,00:00:00.3981409,00:00:00.2025855,00:00:00.3609484,00:00:00.0012963,00:00:00.9629711,
23+
Repeat 6400 for size 2000,QueueObjectPool,00:00:00.5199373,00:00:02.5465317,00:00:02.4285615,00:00:00.8731311,00:00:06.3681616,
24+
Repeat 6400 for size 2000,ConcurrentQueueObjectPool,00:00:00.5197277,00:00:00.8558225,00:00:00.7322259,00:00:01.1357703,00:00:03.2435464,
25+
Repeat 6400 for size 2000,OptimisticArrayObjectPool,00:00:00.4943047,00:00:00.2297032,00:00:00.4033160,00:00:00.0010375,00:00:01.1283614,
26+
Repeat 6400 for size 2000,InterlockedArrayObjectPool,00:00:00.4761291,00:00:00.2311264,00:00:00.4388072,00:00:00.0009975,00:00:01.1470602,
27+
Repeat 4800 for size 4000,QueueObjectPool,00:00:00.7134197,00:00:03.7582117,00:00:03.1855656,00:00:01.2950620,00:00:08.9522590,
28+
Repeat 4800 for size 4000,ConcurrentQueueObjectPool,00:00:00.7232603,00:00:01.2258140,00:00:01.0573101,00:00:01.6096397,00:00:04.6160241,
29+
Repeat 4800 for size 4000,OptimisticArrayObjectPool,00:00:00.6968814,00:00:00.3086700,00:00:00.5845562,00:00:00.0007690,00:00:01.5908766,
30+
Repeat 4800 for size 4000,InterlockedArrayObjectPool,00:00:00.6864968,00:00:00.3074012,00:00:00.6233171,00:00:00.0007314,00:00:01.6179465,
31+
Repeat 2400 for size 8000,QueueObjectPool,00:00:00.7021946,00:00:03.5501399,00:00:02.5203758,00:00:01.2936158,00:00:08.0663261,
32+
Repeat 2400 for size 8000,ConcurrentQueueObjectPool,00:00:00.7088997,00:00:01.2280982,00:00:01.0299925,00:00:01.5836229,00:00:04.5506133,
33+
Repeat 2400 for size 8000,OptimisticArrayObjectPool,00:00:00.6956117,00:00:00.2895694,00:00:00.5699170,00:00:00.0004110,00:00:01.5555091,
34+
Repeat 2400 for size 8000,InterlockedArrayObjectPool,00:00:00.6782009,00:00:00.2871359,00:00:00.6188317,00:00:00.0003863,00:00:01.5845548,

0 commit comments

Comments
 (0)