From 7ab3be6220df8f330a96ffc60d32f5f0d9e8905a Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 24 May 2023 10:33:17 -0400 Subject: [PATCH] Avoid reallocation of slice in preloaded task runner --- internal/graph/check.go | 2 +- internal/graph/preloadedtaskrunner.go | 4 ++-- internal/graph/preloadedtaskrunner_test.go | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/graph/check.go b/internal/graph/check.go index b3c4700857..9f1647dcd0 100644 --- a/internal/graph/check.go +++ b/internal/graph/check.go @@ -791,7 +791,7 @@ func dispatchAllAsync[T any]( resultChan chan<- CheckResult, concurrencyLimit uint16, ) { - tr := newPreloadedTaskRunner(ctx, concurrencyLimit) + tr := newPreloadedTaskRunner(ctx, concurrencyLimit, len(children)) for _, currentChild := range children { currentChild := currentChild tr.add(func(ctx context.Context) error { diff --git a/internal/graph/preloadedtaskrunner.go b/internal/graph/preloadedtaskrunner.go index 9372037c78..aed0cc78b9 100644 --- a/internal/graph/preloadedtaskrunner.go +++ b/internal/graph/preloadedtaskrunner.go @@ -22,7 +22,7 @@ type preloadedTaskRunner struct { tasks []TaskFunc } -func newPreloadedTaskRunner(ctx context.Context, concurrencyLimit uint16) *preloadedTaskRunner { +func newPreloadedTaskRunner(ctx context.Context, concurrencyLimit uint16, initialCapacity int) *preloadedTaskRunner { // Ensure a concurrency level of at least 1. if concurrencyLimit <= 0 { concurrencyLimit = 1 @@ -33,7 +33,7 @@ func newPreloadedTaskRunner(ctx context.Context, concurrencyLimit uint16) *prelo ctx: ctxWithCancel, cancel: cancel, sem: make(chan token, concurrencyLimit), - tasks: make([]TaskFunc, 0), + tasks: make([]TaskFunc, 0, initialCapacity), } } diff --git a/internal/graph/preloadedtaskrunner_test.go b/internal/graph/preloadedtaskrunner_test.go index 760cc3d8a8..dfb2a536c4 100644 --- a/internal/graph/preloadedtaskrunner_test.go +++ b/internal/graph/preloadedtaskrunner_test.go @@ -17,7 +17,7 @@ import ( func TestPreloadedTaskRunnerCompletesAllTasks(t *testing.T) { defer goleak.VerifyNone(t) - tr := newPreloadedTaskRunner(context.Background(), 2) + tr := newPreloadedTaskRunner(context.Background(), 2, 5) wg := sync.WaitGroup{} for i := 0; i < 5; i++ { @@ -44,7 +44,7 @@ func TestPreloadedTaskRunnerCancelsEarlyDueToError(t *testing.T) { ctx, cancel := context.WithCancel(ctx) defer cancel() - tr := newPreloadedTaskRunner(ctx, 3) + tr := newPreloadedTaskRunner(ctx, 3, 10) completed := sync.Map{} for i := 0; i < 10; i++ { @@ -82,7 +82,7 @@ func TestPreloadedTaskRunnerCancelsEarlyDueToCancel(t *testing.T) { ctx, cancel := context.WithCancel(ctx) defer cancel() - tr := newPreloadedTaskRunner(ctx, 3) + tr := newPreloadedTaskRunner(ctx, 3, 10) completed := sync.Map{} for i := 0; i < 10; i++ {