Skip to content

Instantly share code, notes, and snippets.

@noseratio
Created July 1, 2021 05:00
Show Gist options
  • Save noseratio/e98f245dbba8c82cf492f77853d9540f to your computer and use it in GitHub Desktop.
Save noseratio/e98f245dbba8c82cf492f77853d9540f to your computer and use it in GitHub Desktop.
Deriving from Promise class can slow down things
void async function() {
// extending Promise
class PromiseEx extends Promise {
}
// extending Promise as Deferred
class Deferred extends Promise {
resolve;
reject;
static get [Symbol.species]() {
return Promise;
}
constructor() {
let args;
super((...a) => args = a);
[this.resolve, this.reject] = args;
}
// this adds even more overhead:
/*
then = super.then.bind(this);
catch = super.catch.bind(this);
finally = super.finally.bind(this);
*/
}
// containing a Promise
function createDeferred() {
let resolve, reject;
const promise = new Promise((...a) => [resolve, reject] = a);
return {
resolve,
reject,
promise,
then: promise.then.bind(promise)
};
}
// this test is slow on Firefox
const iterations = /firefox/i.test(globalThis.navigator?.userAgent) ? 200_000: 3_000_000;
const cached = Promise.resolve();
// testing new Promise directly
console.time("new Promise");
for (let n = 0; n < iterations; n++) {
let resolve;
const p = new Promise(r => resolve = r);
cached.then(resolve);
await p;
}
console.timeEnd("new Promise");
// testing new PromiseEx
console.time("new PromiseEx");
for (let n = 0; n < iterations; n++) {
let resolve;
const p = new PromiseEx(r => resolve = r);
cached.then(resolve);
await p;
}
console.timeEnd("new PromiseEx");
// testing new Deferred()
console.time("new Deferred");
for (let n = 0; n < iterations; n++) {
const d = new Deferred();
cached.then(d.resolve);
await d;
}
console.timeEnd("new Deferred");
// testing createDeferred as thenable
console.time("createDeferred as thenable");
for (let n = 0; n < iterations; n++) {
const d = createDeferred();
cached.then(d.resolve);
await d;
}
console.timeEnd("createDeferred as thenable");
// testing createDeferred.promise
console.time("createDeferred.promise");
for (let n = 0; n < iterations; n++) {
const d = createDeferred();
cached.then(d.resolve);
await d.promise;
}
console.timeEnd("createDeferred.promise");
}().catch(console.error);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment