Created
July 1, 2021 05:00
-
-
Save noseratio/e98f245dbba8c82cf492f77853d9540f to your computer and use it in GitHub Desktop.
Deriving from Promise class can slow down things
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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