Skip to content

Commit 56b7f53

Browse files
committed
added: "close to real" RentReturnRent ObjectPoolComparison benchmark
1 parent 75b8dd3 commit 56b7f53

2 files changed

Lines changed: 107 additions & 17 deletions

File tree

src/Playground/ObjectPoolComparison.cs

Lines changed: 105 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace Playground
66
{
77
[MemoryDiagnoser, DisassemblyDiagnoser]
8-
public class ObjectPoolComparison_AccessPrefilledPools
8+
public class ObjectPoolComparison_RentReturnAndRentPrefilledPool
99
{
1010
private ScanPool<X> _scanPool;
1111
private StackPool<X> _stackPool;
@@ -15,8 +15,91 @@ public void CreateAndPopulatePools()
1515
{
1616
_scanPool = new ScanPool<X>();
1717
_scanPool.Return(new X(false, 0, null));
18+
_scanPool.ScanReturn(new X(false, 0, null));
19+
_scanPool.ScanReturn(new X(false, 0, null));
20+
21+
_stackPool = new StackPool<X>();
22+
_stackPool.Return(new X(false, 0, null));
23+
_stackPool.Return(new X(false, 0, null));
24+
}
25+
26+
[Benchmark(Baseline = true)]
27+
public int New_4Times()
28+
{
29+
var x1 = new X(true, 1, "1");
30+
var x2 = new X(true, 2, "2");
31+
32+
x1 = new X(false, 3, "3");
33+
x2 = new X(false, 4, "4");
34+
35+
return x1.I + x2.I;
36+
}
37+
38+
[Benchmark]
39+
public int StackPool_2Rents2Returns2Rents()
40+
{
41+
var p = _stackPool;
42+
43+
var x1 = p.RentOrNew(true, 1, "1");
44+
var x2 = p.RentOrNew(true, 2, "2");
45+
46+
p.Return(x1);
47+
p.Return(x2);
48+
49+
x1 = p.RentOrNew(false, 3, "3");
50+
x2 = p.RentOrNew(false, 4, "4");
51+
52+
return x1.I + x2.I;
53+
}
54+
55+
[Benchmark]
56+
public int ScanPool_2Rents2Returns2Rents()
57+
{
58+
var p = _scanPool;
59+
60+
var x1 = p.RentOrNew(true, 1, "1");
61+
var x2 = p.RentOrNew(true, 2, "2");
62+
63+
p.Return(x1);
64+
p.Return(x2);
65+
66+
x1 = p.RentOrNew(false, 3, "3");
67+
x2 = p.RentOrNew(false, 4, "4");
68+
69+
return x1.I + x2.I;
70+
}
71+
72+
[Benchmark]
73+
public int ScanPool_ScanOnly_2Rents2Returns2Rents()
74+
{
75+
var p = _scanPool;
76+
77+
var x1 = p.ScanRentOrNew(true, 1, "1");
78+
var x2 = p.ScanRentOrNew(true, 2, "2");
79+
80+
p.ScanReturn(x1);
81+
p.ScanReturn(x2);
82+
83+
x1 = p.ScanRentOrNew(false, 3, "3");
84+
x2 = p.ScanRentOrNew(false, 4, "4");
85+
86+
return x1.I + x2.I;
87+
}
88+
}
89+
90+
[MemoryDiagnoser, DisassemblyDiagnoser]
91+
public class ObjectPoolComparison_RentPrefilledPool
92+
{
93+
private ScanPool<X> _scanPool;
94+
private StackPool<X> _stackPool;
95+
96+
[IterationSetup]
97+
public void CreateAndPopulatePools()
98+
{
99+
_scanPool = new ScanPool<X>();
18100
_scanPool.Return(new X(false, 0, null));
19-
_scanPool.Return(new X(false, 0, null));
101+
_scanPool.ScanReturn(new X(false, 0, null));
102+
_scanPool.ScanReturn(new X(false, 0, null));
20103

21104
_stackPool = new StackPool<X>();
22105
_stackPool.Return(new X(false, 0, null));
@@ -26,37 +109,43 @@ public void CreateAndPopulatePools()
26109
[Benchmark(Baseline = true)]
27110
public int New_2Times()
28111
{
29-
var x3 = new X(true, 1, "1");
30-
var x4 = new X(true, 2, "2");
112+
var x1 = new X(true, 1, "1");
113+
var x2 = new X(true, 2, "2");
31114

32-
return x3.I + x4.I;
115+
return x1.I + x2.I;
33116
}
34117

35118
[Benchmark]
36119
public int StackPool_2Rents()
37120
{
38-
var x3 = _stackPool.RentOrNew(true, 1, "1");
39-
var x4 = _stackPool.RentOrNew(true, 2, "2");
121+
var p = _stackPool;
40122

41-
return x3.I + x4.I;
123+
var x1 = p.RentOrNew(true, 1, "1");
124+
var x2 = p.RentOrNew(true, 2, "2");
125+
126+
return x1.I + x2.I;
42127
}
43128

44129
[Benchmark]
45130
public int ScanPool_2Rents()
46131
{
47-
var x3 = _scanPool.RentOrNew(true, 1, "1");
48-
var x4 = _scanPool.RentOrNew(true, 2, "2");
132+
var p = _scanPool;
49133

50-
return x3.I + x4.I;
134+
var x1 = p.RentOrNew(true, 1, "1");
135+
var x2 = p.RentOrNew(true, 2, "2");
136+
137+
return x1.I + x2.I;
51138
}
52139

53140
[Benchmark]
54141
public int ScanPool_ScanOnly_2Rents()
55142
{
56-
var x3 = _scanPool.ScanRentOrNew(true, 1, "1");
57-
var x4 = _scanPool.ScanRentOrNew(true, 2, "2");
143+
var p = _scanPool;
58144

59-
return x3.I + x4.I;
145+
var x1 = p.ScanRentOrNew(true, 1, "1");
146+
var x2 = p.ScanRentOrNew(true, 2, "2");
147+
148+
return x1.I + x2.I;
60149
}
61150
}
62151

@@ -215,11 +304,11 @@ public T ScanRent()
215304
public void Return(T x)
216305
{
217306
if (Interlocked.CompareExchange(ref _x, x, null) != null)
218-
ScanSet(x);
307+
ScanReturn(x);
219308
}
220309

221310
[MethodImpl(MethodImplOptions.AggressiveInlining)]
222-
private void ScanSet(T x)
311+
public void ScanReturn(T x)
223312
{
224313
var xs = _xs;
225314
for (var i = 0; i < xs.Length &&

src/Playground/Program.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ class Program
66
{
77
static void Main()
88
{
9-
BenchmarkRunner.Run<ObjectPoolComparison_AccessPrefilledPools>();
9+
BenchmarkRunner.Run<ObjectPoolComparison_RentReturnAndRentPrefilledPool>();
10+
//BenchmarkRunner.Run<ObjectPoolComparison_RentPrefilledPool>();
1011

1112
//BenchmarkRunner.Run<ObjectPoolComparison>();
1213
//BenchmarkRunner.Run<DelegateVsInterfaceStruct.MapArray>();

0 commit comments

Comments
 (0)