55namespace 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 &&
0 commit comments