From b92d897803cdeac5d55caa1f0f48293112fbeba9 Mon Sep 17 00:00:00 2001 From: David Sehnal <david.sehnal@gmail.com> Date: Sat, 9 Dec 2017 00:43:30 +0100 Subject: [PATCH] task yield tests --- src/mol-task/util/immediate.ts | 4 +- src/perf-tests/tasks.ts | 129 +++++++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/perf-tests/tasks.ts diff --git a/src/mol-task/util/immediate.ts b/src/mol-task/util/immediate.ts index 411f82db3..df8b2f764 100644 --- a/src/mol-task/util/immediate.ts +++ b/src/mol-task/util/immediate.ts @@ -181,7 +181,9 @@ const immediateActions = (function () { setImmediate: (handler: any, ...args: any[]) => window.setImmediate(handler, ...args as any), clearImmediate: (handle: any) => window.clearImmediate(handle) }; - } else return { setImmediate, clearImmediate } + } else { + return { setImmediate, clearImmediate } + } } return createImmediateActions(); }()); diff --git a/src/perf-tests/tasks.ts b/src/perf-tests/tasks.ts new file mode 100644 index 000000000..38c8b9885 --- /dev/null +++ b/src/perf-tests/tasks.ts @@ -0,0 +1,129 @@ +import * as B from 'benchmark' +import now from 'mol-task/util/now' +import Immedite from 'mol-task/util/immediate' + +export namespace Tasks { + export class Yielding { + lastUpdated = 0; + yield(): Promise<void> | void { + const t = now(); + if (t - this.lastUpdated < 250) return; + this.lastUpdated = t; + return Immedite.immediatePromise(); + } + } + + export class CheckYielding { + lastUpdated = 0; + + get needsYield() { + return now() - this.lastUpdated > 250; + } + + yield(): Promise<void> { + this.lastUpdated = now(); + return Immedite.immediatePromise(); + } + } + + export async function yielding() { + console.time('yielding'); + const y = new Yielding(); + let ret = 0; + for (let i = 0; i < 1000000; i++) { + ret += +(i.toString() + i.toString()); + if (i % 10000 === 0) await y.yield(); + } + console.timeEnd('yielding'); + console.log(ret); + return ret; + } + + export async function yielding1() { + console.time('yielding1'); + const y = new Yielding(); + let ret = 0; + let yy: any; + for (let i = 0; i < 1000000; i++) { + ret += +(i.toString() + i.toString()); + if (i % 10000 === 0 && (yy = y.yield())) await yy; + } + console.timeEnd('yielding1'); + console.log(ret); + return ret; + } + + export async function testYielding() { + console.time('check yielding'); + const y = new CheckYielding(); + let ret = 0; + for (let i = 0; i < 1000000; i++) { + ret += +(i.toString() + i.toString()); + if (i % 10000 === 0 && y.needsYield) await y.yield(); + } + console.timeEnd('check yielding'); + console.log(ret); + return ret; + } + + export async function baseline() { + console.time('baseline'); + let ret = 0; + for (let i = 0; i < 1000000; i++) { + ret += +(i.toString() + i.toString()); + } + console.timeEnd('baseline'); + console.log(ret); + return ret; + } + + export async function testImmediate() { + console.time('immediate'); + let ret = 0; + const y = new CheckYielding(); + for (let i = 0; i < 1000000; i++) { + //ret += +(i.toString() + i.toString()); + if (i % 10000 === 0) await y.yield(); + } + console.timeEnd('immediate'); + console.log(ret); + return ret; + } + + export function run() { + const suite = new B.Suite(); + suite + .add(`yielding`, async () => { return await yielding() }) + //.add(`test yielding`, () => testYielding().then(() => { })) + .on('cycle', (e: any) => console.log(String(e.target))) + .run(); + } +} + +(async function() { + // await Tasks.testImmediate(); + // await Tasks.testImmediate(); + + await Tasks.baseline(); + await Tasks.yielding(); + await Tasks.yielding1(); + await Tasks.testYielding(); + await Tasks.baseline(); + await Tasks.yielding(); + await Tasks.yielding1(); + await Tasks.testYielding(); +}()) + +// console.time('test') +// Tasks.yielding(); +// console.timeEnd('test') +// console.time('test') +// Tasks.yielding(); +// console.timeEnd('test') + +// console.time('test') +// Tasks.testYielding(); +// console.timeEnd('test') +// console.time('test') +// Tasks.testYielding(); +// console.timeEnd('test') \ No newline at end of file -- GitLab