From f9154ab425d5d5914ae6c408b783928388e98b35 Mon Sep 17 00:00:00 2001 From: David Sehnal <david.sehnal@gmail.com> Date: Sun, 12 Nov 2017 00:51:02 +0100 Subject: [PATCH] more chunker updates --- src/mol-util/computation.ts | 20 +++++++++++++++++--- src/script.ts | 2 +- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/mol-util/computation.ts b/src/mol-util/computation.ts index 81f92920a..3d956de70 100644 --- a/src/mol-util/computation.ts +++ b/src/mol-util/computation.ts @@ -221,7 +221,10 @@ class ChunkerImpl implements Computation.Chunker { private updater: Computation.Context['update']; private computeChunkSize(delta: number) { - if (!delta) return this.nextChunkSize; + if (!delta) { + this.processedSinceUpdate = 0; + return this.nextChunkSize; + } const rate = (this.context as ObservableContext).updateRate || DefaulUpdateRateMs; const ret = Math.round(this.processedSinceUpdate * rate / delta + 1); this.processedSinceUpdate = 0; @@ -241,23 +244,34 @@ class ChunkerImpl implements Computation.Chunker { async process(nextChunk: (size: number) => number, update: (updater: Computation.Context['update']) => Promise<void> | void, nextChunkSize?: number) { if (typeof nextChunkSize !== 'undefined') this.setNextChunkSize(nextChunkSize); + this.processedSinceUpdate = 0; // track time for the actual computation and exclude the "update time" let chunkStart = Computation.now(); let lastChunkSize: number; + let chunkCount = 0; + let totalSize = 0; + let updateCount = 0; while ((lastChunkSize = nextChunk(this.getNextChunkSize())) > 0) { + chunkCount++; this.processedSinceUpdate += lastChunkSize; + totalSize += lastChunkSize; if (this.context.requiresUpdate) { let time = Computation.now(); await update(this.updater); - this.nextChunkSize = this.computeChunkSize(time - chunkStart); + this.nextChunkSize = updateCount > 0 + ? Math.round((totalSize + this.computeChunkSize(time - chunkStart)) / (chunkCount + 1)) + : this.computeChunkSize(time - chunkStart) + updateCount++; chunkStart = Computation.now(); } } if (this.context.requiresUpdate) { let time = Computation.now(); await update(this.updater); - this.nextChunkSize = this.computeChunkSize(time - chunkStart); + this.nextChunkSize = updateCount > 0 + ? Math.round((totalSize + this.computeChunkSize(time - chunkStart)) / (chunkCount + 1)) + : this.computeChunkSize(time - chunkStart) } } diff --git a/src/script.ts b/src/script.ts index 03ac84b99..de1047e64 100644 --- a/src/script.ts +++ b/src/script.ts @@ -148,7 +148,7 @@ async function runCIF(input: string | Uint8Array) { export async function _cif() { let path = `./examples/1grm_updated.cif`; // path = '../test/3j3q.cif' // lets have a relative path for big test files - //path = 'e:/test/quick/3j3q_updated.cif'; + // path = 'e:/test/quick/3j3q_updated.cif'; const input = await readFileAsync(path, 'utf8') console.log('------------------'); console.log('Text CIF:'); -- GitLab