opt: leverage binary-search algorithm to speed up PoolWithFunc.purgeStaleWorkers()

This commit is contained in:
Andy Pan 2022-12-11 19:40:00 +08:00
parent 7b1e246b0e
commit 3fbd9567c9
2 changed files with 13 additions and 5 deletions

View File

@ -40,7 +40,7 @@ jobs:
uses: golangci/golangci-lint-action@v3 uses: golangci/golangci-lint-action@v3
with: with:
version: v1.50.1 version: v1.50.1
args: -v -E gofumpt -E gocritic -E misspell -E revive -E godot args: --timeout 5m -v -E gofumpt -E gocritic -E misspell -E revive -E godot
test: test:
needs: lint needs: lint
strategy: strategy:

View File

@ -89,17 +89,25 @@ func (p *PoolWithFunc) purgeStaleWorkers(ctx context.Context) {
break break
} }
currentTime := time.Now() criticalTime := time.Now().Add(-p.options.ExpiryDuration)
p.lock.Lock() p.lock.Lock()
idleWorkers := p.workers idleWorkers := p.workers
n := len(idleWorkers) n := len(idleWorkers)
var i int l, r, mid := 0, n-1, 0
for i = 0; i < n && currentTime.Sub(idleWorkers[i].recycleTime) > p.options.ExpiryDuration; i++ { for l <= r {
mid = (l + r) / 2
if criticalTime.Before(idleWorkers[mid].recycleTime) {
r = mid - 1
} else {
l = mid + 1
} }
}
i := r + 1
expiredWorkers = append(expiredWorkers[:0], idleWorkers[:i]...) expiredWorkers = append(expiredWorkers[:0], idleWorkers[:i]...)
if i > 0 { if i > 0 {
m := copy(idleWorkers, idleWorkers[i:]) m := copy(idleWorkers, idleWorkers[i:])
for i = m; i < n; i++ { for i := m; i < n; i++ {
idleWorkers[i] = nil idleWorkers[i] = nil
} }
p.workers = idleWorkers[:m] p.workers = idleWorkers[:m]