From 3fbd9567c90e88262090863638c5d9acd2c772f6 Mon Sep 17 00:00:00 2001 From: Andy Pan Date: Sun, 11 Dec 2022 19:40:00 +0800 Subject: [PATCH] opt: leverage binary-search algorithm to speed up PoolWithFunc.purgeStaleWorkers() --- .github/workflows/test.yml | 2 +- pool_func.go | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b7f531f..b31e475 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,7 +40,7 @@ jobs: uses: golangci/golangci-lint-action@v3 with: 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: needs: lint strategy: diff --git a/pool_func.go b/pool_func.go index 6bca66e..a3cf224 100644 --- a/pool_func.go +++ b/pool_func.go @@ -89,17 +89,25 @@ func (p *PoolWithFunc) purgeStaleWorkers(ctx context.Context) { break } - currentTime := time.Now() + criticalTime := time.Now().Add(-p.options.ExpiryDuration) + p.lock.Lock() idleWorkers := p.workers n := len(idleWorkers) - var i int - for i = 0; i < n && currentTime.Sub(idleWorkers[i].recycleTime) > p.options.ExpiryDuration; i++ { + l, r, mid := 0, n-1, 0 + 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]...) if i > 0 { m := copy(idleWorkers, idleWorkers[i:]) - for i = m; i < n; i++ { + for i := m; i < n; i++ { idleWorkers[i] = nil } p.workers = idleWorkers[:m]