From fdfd3ad73408020831502a1aaca2622273d9327a Mon Sep 17 00:00:00 2001
From: Alexander Rose <alex.rose@rcsb.org>
Date: Wed, 23 May 2018 14:20:14 -0700
Subject: [PATCH] added user-timing to mol-task

---
 src/mol-task/execution/observable.ts |  6 +++++-
 src/mol-task/util/user-timing.ts     | 23 +++++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)
 create mode 100644 src/mol-task/util/user-timing.ts

diff --git a/src/mol-task/execution/observable.ts b/src/mol-task/execution/observable.ts
index 81fe04efb..6f2cb67c2 100644
--- a/src/mol-task/execution/observable.ts
+++ b/src/mol-task/execution/observable.ts
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ * Copyright (c) 2017-2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
  * @author David Sehnal <david.sehnal@gmail.com>
  */
@@ -9,6 +9,7 @@ import { RuntimeContext } from './runtime-context'
 import { Progress } from './progress'
 import { now } from '../util/now'
 import { Scheduler } from '../util/scheduler'
+import { UserTiming } from '../util/user-timing'
 
 interface ExposedTask<T> extends Task<T> {
     f: (ctx: RuntimeContext) => Promise<T>,
@@ -91,9 +92,12 @@ function snapshotProgress(info: ProgressInfo): Progress {
 }
 
 async function execute<T>(task: ExposedTask<T>, ctx: ObservableRuntimeContext) {
+    UserTiming.markStart(task)
     ctx.node.progress.startedTime = now();
     try {
         const ret = await task.f(ctx);
+        UserTiming.markEnd(task)
+        UserTiming.measure(task)
         if (ctx.info.abortToken.abortRequested) {
             abort(ctx.info, ctx.node);
         }
diff --git a/src/mol-task/util/user-timing.ts b/src/mol-task/util/user-timing.ts
new file mode 100644
index 000000000..fc64b57ab
--- /dev/null
+++ b/src/mol-task/util/user-timing.ts
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ *
+ * @author Alexander Rose <alexander.rose@weirdbyte.de>
+ */
+
+import { Task } from '../task'
+
+const hasPerformance = typeof performance !== 'undefined'
+
+export namespace UserTiming {
+    function startMarkName(task: Task<any>) { return `startTask${task.id}` }
+    function endMarkName(task: Task<any>) { return `endTask${task.id}` }
+    export function markStart(task: Task<any>) {
+        if (hasPerformance) performance.mark(startMarkName(task))
+    }
+    export function markEnd(task: Task<any>) {
+        if (hasPerformance) performance.mark(endMarkName(task))
+    }
+    export function measure(task: Task<any>) {
+        if (hasPerformance) performance.measure(task.name, startMarkName(task), endMarkName(task))
+    }
+}
\ No newline at end of file
-- 
GitLab