From e0bca9517b1d0fbec661f8496fa247eb631550e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Tue, 21 Oct 2025 23:08:45 +0300 Subject: [PATCH] perf: warmup next queued worker --- packages/vitest/src/node/pools/pool.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/vitest/src/node/pools/pool.ts b/packages/vitest/src/node/pools/pool.ts index 3251c34bf3c9..12d2aeb8a3b6 100644 --- a/packages/vitest/src/node/pools/pool.ts +++ b/packages/vitest/src/node/pools/pool.ts @@ -20,6 +20,7 @@ interface QueuedTask { task: PoolTask resolver: ReturnType method: 'run' | 'collect' + warmRunner?: Promise } interface ActiveTask extends QueuedTask { @@ -67,11 +68,11 @@ export class Pool { return } - const { task, resolver, method } = this.queue.shift()! + const { task, resolver, method, warmRunner } = this.queue.shift()! try { let isMemoryLimitReached = false - const runner = this.getPoolRunner(task, method) + const runner = warmRunner ? await warmRunner : this.getPoolRunner(task, method) const activeTask = { task, resolver, method, cancelTask } this.activeTasks.push(activeTask) @@ -123,6 +124,14 @@ export class Pool { poolId, }) + const next = this.queue.find(entry => !entry.warmRunner && entry.task.isolate) + + // Warmup the next runtime. This will start the dynamic imports inside the worker early. + if (next) { + const warmRunner = this.getPoolRunner(next.task, next.method) + next.warmRunner = warmRunner.start().then(() => warmRunner) + } + await resolver.promise const index = this.activeTasks.indexOf(activeTask) @@ -175,6 +184,7 @@ export class Pool { if (pendingTasks.length) { const error = new Error('Cancelled') pendingTasks.forEach(task => task.resolver.reject(error)) + await Promise.all(pendingTasks.map(task => task.warmRunner?.then(runner => runner.stop()))) } const activeTasks = this.activeTasks.splice(0)