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