Skip to content

Commit 03214ba

Browse files
committed
Remove ReleaseFactorBase property; calculate it on init.
1 parent 248be06 commit 03214ba

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

lbpool.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@ const (
99
// Default size of the pool.
1010
defaultPoolSize = 64
1111

12-
// Default release factor
12+
// Default release factor.
1313
defaultReleaseFactor float32 = 0
14-
// and precision.
15-
defaultReleaseFactorBase uint32 = 100
1614

1715
// Pool status code.
1816
stateNil = 0
@@ -41,7 +39,7 @@ type Pool struct {
4139
// * RF == 0.05
4240
// * RF base == 100
4341
// , means that 5% of items will be drop on the floor.
44-
ReleaseFactorBase uint32
42+
rfBase uint32
4543
// Function to make new object if pool didn't deliver existing.
4644
New func() interface{}
4745
// Internal storage and status flag.
@@ -75,8 +73,13 @@ func (p *Pool) initPool() {
7573
if p.ReleaseFactor > 1.0 {
7674
p.ReleaseFactor = 1.0
7775
}
78-
if p.ReleaseFactorBase == 0 {
79-
p.ReleaseFactorBase = defaultReleaseFactorBase
76+
if p.rfBase == 0 {
77+
p.rfBase = 1
78+
}
79+
if p.ReleaseFactor > defaultReleaseFactor && p.ReleaseFactor < 1 {
80+
for float32(p.rfBase)*p.ReleaseFactor < 1 {
81+
p.rfBase *= 10
82+
}
8083
}
8184

8285
// Check size and init the storage.
@@ -113,12 +116,12 @@ func (p *Pool) Get() interface{} {
113116
// Put adds x to the pool.
114117
func (p *Pool) Put(x Releaser) bool {
115118
// Check release factor first.
116-
if p.ReleaseFactor > 0 && p.ReleaseFactorBase > 0 {
119+
if p.ReleaseFactor > 0 && p.rfBase > 0 {
117120
rfc := atomic.AddUint32(&p.rfCounter, 1)
118-
if rfc >= p.ReleaseFactorBase {
121+
if rfc >= p.rfBase {
119122
// Release factor counter limit reached, reset it.
120123
atomic.StoreUint32(&p.rfCounter, 0)
121-
} else if float32(rfc)/float32(p.ReleaseFactorBase) <= p.ReleaseFactor {
124+
} else if float32(rfc)/float32(p.rfBase) <= p.ReleaseFactor {
122125
// Drop x on the floor.
123126
x.Release()
124127
return false

lbpool_test.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ func (i *testPoolItem) fill() {
4040
}
4141

4242
func TestPool(t *testing.T) {
43-
p := Pool{}
43+
p := Pool{
44+
ReleaseFactor: 0.000001,
45+
}
4446

4547
for i := 0; i < 100; i++ {
4648
var item *testPoolItem
@@ -56,7 +58,9 @@ func TestPool(t *testing.T) {
5658
}
5759

5860
func TestPoolParallel(t *testing.T) {
59-
p := Pool{}
61+
p := Pool{
62+
ReleaseFactor: 0.000001,
63+
}
6064

6165
for i := 0; i < 100; i++ {
6266
var wg sync.WaitGroup
@@ -84,8 +88,7 @@ func TestPoolParallel(t *testing.T) {
8488

8589
func BenchmarkPool(b *testing.B) {
8690
p := Pool{
87-
ReleaseFactor: 0.000001,
88-
ReleaseFactorBase: 1e6,
91+
ReleaseFactor: 0.000001,
8992
}
9093
b.ReportAllocs()
9194

@@ -106,8 +109,7 @@ func BenchmarkPoolParallel(b *testing.B) {
106109
b.ReportAllocs()
107110
b.RunParallel(func(pb *testing.PB) {
108111
p := Pool{
109-
ReleaseFactor: 0.000001,
110-
ReleaseFactorBase: 1e6,
112+
ReleaseFactor: 0.000001,
111113
}
112114
for pb.Next() {
113115
var item *testPoolItem

0 commit comments

Comments
 (0)