Skip to content

Commit 82ed41b

Browse files
author
Oren (electricessence)
committed
Updated benchmarking to allow common base class and reuse.
1 parent 16e674c commit 82ed41b

8 files changed

Lines changed: 168 additions & 562 deletions

benchmarking/Benchmark.cs

Lines changed: 10 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,24 @@
1-
using System;
1+
using Open.Diagnostics;
2+
using System;
23
using System.Collections.Concurrent;
34
using System.Collections.Generic;
45
using System.Diagnostics;
5-
using System.Linq;
6-
using System.Text;
7-
using System.Threading;
86
using System.Threading.Tasks;
97

108
namespace Open.Disposable.ObjectPools
119
{
12-
public class Benchmark<T>
10+
public class Benchmark<T> : BenchmarkBase<Func<IObjectPool<T>>>
1311
where T : class
1412
{
15-
public readonly uint TestSize; // Pool capacity should be at least 2x this.
16-
public readonly uint RepeatCount; // Number of times to repeat the test from scratch.
17-
public readonly Func<IObjectPool<T>> PoolFactory;
18-
19-
public Benchmark(uint size, uint repeat, Func<IObjectPool<T>> poolFactory)
13+
public Benchmark(uint size, uint repeat, Func<IObjectPool<T>> poolFactory) : base(size,repeat,poolFactory)
2014
{
21-
TestSize = size;
22-
RepeatCount = repeat;
23-
PoolFactory = poolFactory;
2415
}
2516

26-
public IEnumerable<TimedResult> TestOnce()
27-
{
28-
var total = TimeSpan.Zero;
29-
foreach(var r in TestOnceInternal())
30-
{
31-
total += r.Duration;
32-
yield return r;
33-
}
3417

35-
yield return new TimedResult("99) TOTAL", total);
36-
}
37-
38-
IEnumerable<TimedResult> TestOnceInternal()
18+
protected override IEnumerable<TimedResult> TestOnceInternal()
3919
{
4020
var disposeTimer = new Stopwatch();
41-
using (var pool = TimedResult.Measure(out TimedResult constructionTime, "01) Pool Construction", PoolFactory))
21+
using (var pool = TimedResult.Measure(out TimedResult constructionTime, "Pool Construction", Param))
4222
{
4323
// yield return constructionTime; // Looking for anomalies.
4424

@@ -50,7 +30,7 @@ IEnumerable<TimedResult> TestOnceInternal()
5030

5131
var tank = new ConcurrentBag<T>(); // This will have an effect on performance measurement, but hopefully consistently.
5232

53-
yield return TimedResult.Measure("03) Take From Empty (In Parallel)", () =>
33+
yield return TimedResult.Measure("Take From Empty (In Parallel)", () =>
5434
{
5535
Parallel.For(0, TestSize, i => tank.Add(pool.Take()));
5636
});
@@ -61,12 +41,12 @@ IEnumerable<TimedResult> TestOnceInternal()
6141
tank.Add(pool.Generate());
6242
}
6343

64-
yield return TimedResult.Measure("04) Give To (In Parallel)", () =>
44+
yield return TimedResult.Measure("Give To (In Parallel)", () =>
6545
{
6646
Parallel.ForEach(tank, e => pool.Give(e));
6747
});
6848

69-
yield return TimedResult.Measure("05) Mixed Read/Write (In Parallel)", () =>
49+
yield return TimedResult.Measure("Mixed Read/Write (In Parallel)", () =>
7050
{
7151
Parallel.For(0, TestSize, i =>
7252
{
@@ -77,7 +57,7 @@ IEnumerable<TimedResult> TestOnceInternal()
7757
});
7858
});
7959

80-
yield return TimedResult.Measure("06) Empty Pool (.TryTake())", () =>
60+
yield return TimedResult.Measure("Empty Pool (.TryTake())", () =>
8161
{
8262
while (pool.TryTake() != null) {
8363
// remaining++;
@@ -91,31 +71,6 @@ IEnumerable<TimedResult> TestOnceInternal()
9171
// yield return new TimedResult("98) Pool Disposal", disposeTimer); // Looking for anomalies.
9272
}
9373

94-
public IEnumerable<IEnumerable<TimedResult>> TestRepeated()
95-
{
96-
for(var i=0;i<RepeatCount;i++)
97-
{
98-
yield return TestOnce();
99-
}
100-
}
101-
102-
103-
TimedResult[] _result;
104-
public TimedResult[] Result
105-
{
106-
get
107-
{
108-
return LazyInitializer.EnsureInitialized(ref _result, ()=>
109-
TestRepeated()
110-
.SelectMany(s => s)
111-
.GroupBy(k => k.Label)
112-
.Select(g => g.Sum())
113-
.OrderBy(r => r.Label)
114-
.ToArray()
115-
);
116-
}
117-
}
118-
11974
public static TimedResult[] Results(uint size, uint repeat, Func<IObjectPool<T>> poolFactory)
12075
{
12176
return (new Benchmark<T>(size, repeat, poolFactory)).Result;

benchmarking/BenchmarkResult.csv

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
1-
Batch,Pool Type,Take From Empty (In Parallel),Give To (In Parallel),Mixed Read/Write (In Parallel),Empty Pool (.TryTake()),TOTAL,
2-
Repeat 100000 for size 4,LinkedListObjectPool,00:00:00.5446936,00:00:00.9886553,00:00:00.4383719,00:00:00.0944285,00:00:02.0661493,
3-
Repeat 100000 for size 4,QueueObjectPool,00:00:00.5101651,00:00:00.7820358,00:00:00.4396512,00:00:00.0861555,00:00:01.8180076,
4-
Repeat 100000 for size 4,OptimisticArrayObjectPool,00:00:00.4878969,00:00:00.7048874,00:00:00.4294658,00:00:00.0125716,00:00:01.6348217,
5-
Repeat 100000 for size 4,InterlockedArrayObjectPool,00:00:00.5181038,00:00:00.7404542,00:00:00.4350744,00:00:00.0125102,00:00:01.7061426,
6-
Repeat 40000 for size 10,LinkedListObjectPool,00:00:00.3156256,00:00:00.9093478,00:00:00.2870968,00:00:00.0910514,00:00:01.6031216,
7-
Repeat 40000 for size 10,QueueObjectPool,00:00:00.3046181,00:00:00.5989796,00:00:00.2916924,00:00:00.0818583,00:00:01.2771484,
8-
Repeat 40000 for size 10,OptimisticArrayObjectPool,00:00:00.2974992,00:00:00.4454928,00:00:00.2784509,00:00:00.0055634,00:00:01.0270063,
9-
Repeat 40000 for size 10,InterlockedArrayObjectPool,00:00:00.3093777,00:00:00.4456445,00:00:00.2606044,00:00:00.0054850,00:00:01.0211116,
10-
Repeat 8000 for size 100,LinkedListObjectPool,00:00:00.5553015,00:00:01.9316093,00:00:00.3668134,00:00:00.1489426,00:00:03.0026668,
11-
Repeat 8000 for size 100,QueueObjectPool,00:00:00.1716840,00:00:01.0170214,00:00:00.2434091,00:00:00.1359503,00:00:01.5680648,
12-
Repeat 8000 for size 100,OptimisticArrayObjectPool,00:00:00.1624457,00:00:00.8488803,00:00:00.1241455,00:00:00.0012911,00:00:01.1367626,
13-
Repeat 8000 for size 100,InterlockedArrayObjectPool,00:00:00.1695044,00:00:00.8771345,00:00:00.1562285,00:00:00.0012742,00:00:01.2041416,
14-
Repeat 6400 for size 250,LinkedListObjectPool,00:00:00.6692530,00:00:02.7319705,00:00:00.7335461,00:00:00.2487210,00:00:04.3834906,
15-
Repeat 6400 for size 250,QueueObjectPool,00:00:00.2190198,00:00:01.5061960,00:00:00.5232603,00:00:00.2279745,00:00:02.4764506,
16-
Repeat 6400 for size 250,OptimisticArrayObjectPool,00:00:00.2007165,00:00:01.5293083,00:00:00.1518310,00:00:00.0010455,00:00:01.8829013,
17-
Repeat 6400 for size 250,InterlockedArrayObjectPool,00:00:00.2396147,00:00:01.1445379,00:00:00.1543305,00:00:00.0010398,00:00:01.5395229,
18-
Repeat 2400 for size 1000,LinkedListObjectPool,00:00:00.6898274,00:00:02.7620878,00:00:00.7002608,00:00:00.3406904,00:00:04.4928664,
19-
Repeat 2400 for size 1000,QueueObjectPool,00:00:00.2654685,00:00:01.4643862,00:00:00.6240877,00:00:00.3147795,00:00:02.6687219,
20-
Repeat 2400 for size 1000,OptimisticArrayObjectPool,00:00:00.2447782,00:00:00.9322246,00:00:00.2032299,00:00:00.0004221,00:00:01.3806548,
21-
Repeat 2400 for size 1000,InterlockedArrayObjectPool,00:00:00.2853462,00:00:01.2585180,00:00:00.1559039,00:00:00.0004293,00:00:01.7001974,
22-
Repeat 1600 for size 2000,LinkedListObjectPool,00:00:00.8748769,00:00:03.8644551,00:00:00.7567420,00:00:00.4499334,00:00:05.9460074,
1+
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,
2323
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,
2424
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,
2525
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,

0 commit comments

Comments
 (0)