1.0.40 • Published 6 months ago

@budarin/task-queue v1.0.40

Weekly downloads
-
License
MIT
Repository
github
Last release
6 months ago

task-queue

Isomorphic task queue with optimized performance.

The incentive to write this package was the article: "Task Scheduler: do not freeze the tab when opening the page"

This package will help improve some of the key metrics - FID, TTI and TBT. It is known that for many complex applications, due to the large number of sequentially executed tasks, app initialization takes quite a long time, which worsens these metrics.

In order to give the event loop a little sigh between the execution of numerous tasks, you can use setTimeout(f, 0), but the problem arises that if there are more than 4 tasks in the queue, setTimeout will start executing with a delay of 4ms - this is very much in the case of application initialization (we need to initialize the application as quickly as possible).

Under the hood, various techniques are implemented for different environments and browsers:

  • for modern browsers - scheduler.postTask(task)
  • for the rest - MessageChannel is used with a postMessage call
  • for Node.js - setImmediate

Usage example:

import { taskQueue } from '@budarin/task-queue';

let t = performance.now();

const f = () => {
    console.log(performance.now() - t);
    t = performance.now();
};

// pushing tasks to the queue for executing them lately
taskQueue.push(f);
taskQueue.push(f, f, f, f);

// executing tasks in queue
taskQueue.execute();

// executing tasks in queue immediately after pushing them to the queue
taskQueue.exec(f);

taskQueue.push(f);
taskQueue.push(f);
// executing tasks in queue immediately after pushing them to the queue
taskQueue.exec(f, f);

taskQueue.push(f, f, f, f);
// clearing taskQueue
taskQueue.clear();

Example of output of time delays between task execution - they are very small:

0.5
0.09999999403953552
0
0.10000000894069672
0.09999999403953552

It can be seen that there is time between tasks so that the event loop can check and, if available, perform other tasks. This time is very small and does not add a significant overhead to the overall execution of tasks in the queue.

Distributed CommonJS modules are generated for ES6, and ESM modules are generated for ESNext version of JavaScript.

Below is an example of the original flame-graph of long-term initialization of the application

log task

and an example of optimizing long initialization by splitting it into small tasks that do not block for a long time the main thread

ыьфдд ефылы

1.0.40

6 months ago

1.0.39

6 months ago

1.0.38

6 months ago

1.0.37

7 months ago

1.0.36

7 months ago

1.0.35

7 months ago

1.0.34

7 months ago

1.0.33

7 months ago

1.0.32

7 months ago

1.0.31

8 months ago

1.0.30

8 months ago

1.0.29

8 months ago

1.0.28

8 months ago

1.0.27

8 months ago

1.0.26

8 months ago

1.0.25

8 months ago

1.0.24

8 months ago

1.0.23

8 months ago

1.0.22

8 months ago

1.0.21

8 months ago

1.0.20

8 months ago

1.0.19

8 months ago

1.0.18

8 months ago

1.0.17

8 months ago

1.0.16

8 months ago

1.0.15

8 months ago

1.0.14

8 months ago

1.0.13

8 months ago

1.0.12

8 months ago

1.0.11

8 months ago

1.0.10

8 months ago

1.0.9

8 months ago

1.0.8

8 months ago

1.0.7

8 months ago

1.0.6

8 months ago

1.0.5

8 months ago

1.0.4

8 months ago

1.0.3

8 months ago

1.0.2

8 months ago

1.0.1

8 months ago

1.0.0

8 months ago