diff --git a/src/mol-util/computation.ts b/src/mol-util/computation.ts index 81f92920a3cf9587295c00f107f7ff3e010a20f4..3d956de70054e16b858a96c080393ac582517ab7 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 03ac84b99889c9eef8fb0bc8283f4d47fe3e9a50..de1047e64d48f55c7e5f77161d7cc068df61bbcc 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:');