From dec3791f4c693132cf9252884359ea212fdd50cf Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 6 Dec 2022 14:04:10 -0800 Subject: [PATCH 1/2] Log a warning if task queues exceed deadline by 20ms Fixes #4292 --- src/common/TaskQueue.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/common/TaskQueue.ts b/src/common/TaskQueue.ts index 94c5c53b3b..4674ad5b53 100644 --- a/src/common/TaskQueue.ts +++ b/src/common/TaskQueue.ts @@ -66,6 +66,8 @@ abstract class TaskQueue implements ITaskQueue { this._idleCallback = undefined; let taskDuration = 0; let longestTask = 0; + let lastDeadlineRemaining = deadline.timeRemaining(); + let deadlineRemaining = 0; while (this._i < this._tasks.length) { taskDuration = performance.now(); this._tasks[this._i++](); @@ -73,10 +75,17 @@ abstract class TaskQueue implements ITaskQueue { longestTask = Math.max(taskDuration, longestTask); // Guess the following task will take a similar time to the longest task in this batch, allow // additional room to try avoid exceeding the deadline - if (longestTask * 1.5 > deadline.timeRemaining()) { + deadlineRemaining = deadline.timeRemaining(); + if (longestTask * 1.5 > deadlineRemaining) { + // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the + // task should be split into sub-tasks to ensure the UI remains responsive. + if (lastDeadlineRemaining - taskDuration < -5) { + console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`, { stacktrace: new Error().stack }); + } this._start(); return; } + lastDeadlineRemaining = deadlineRemaining; } this.clear(); } From 650cda31fd265a1798778787a426381c84098b2d Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 6 Dec 2022 14:10:40 -0800 Subject: [PATCH 2/2] Tweak logging --- src/common/TaskQueue.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/TaskQueue.ts b/src/common/TaskQueue.ts index 4674ad5b53..30068a5f9a 100644 --- a/src/common/TaskQueue.ts +++ b/src/common/TaskQueue.ts @@ -79,8 +79,8 @@ abstract class TaskQueue implements ITaskQueue { if (longestTask * 1.5 > deadlineRemaining) { // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the // task should be split into sub-tasks to ensure the UI remains responsive. - if (lastDeadlineRemaining - taskDuration < -5) { - console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`, { stacktrace: new Error().stack }); + if (lastDeadlineRemaining - taskDuration < -20) { + console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`); } this._start(); return;