Jelajahi Sumber

task yield tests

David Sehnal 7 tahun lalu
induk
melakukan
b92d897803
2 mengubah file dengan 132 tambahan dan 1 penghapusan
  1. 3 1
      src/mol-task/util/immediate.ts
  2. 129 0
      src/perf-tests/tasks.ts

+ 3 - 1
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();
 }());

+ 129 - 0
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')