Skip to content
Snippets Groups Projects
Commit 9890d480 authored by David Sehnal's avatar David Sehnal
Browse files

more accurate time management for Computation.Chunker

parent 9f0a9db2
No related branches found
No related tags found
No related merge requests found
...@@ -124,8 +124,6 @@ class ObservableContext implements Computation.Context { ...@@ -124,8 +124,6 @@ class ObservableContext implements Computation.Context {
private observers: Computation.ProgressObserver[] | undefined = void 0; private observers: Computation.ProgressObserver[] | undefined = void 0;
private progress: Computation.Progress = { message: 'Working...', current: 0, max: 0, elapsedMs: 0, isIndeterminate: true, requestAbort: void 0 }; private progress: Computation.Progress = { message: 'Working...', current: 0, max: 0, elapsedMs: 0, isIndeterminate: true, requestAbort: void 0 };
lastDelta = 0;
private checkAborted() { private checkAborted() {
if (this.abortRequested) throw Computation.Aborted; if (this.abortRequested) throw Computation.Aborted;
} }
...@@ -186,7 +184,6 @@ class ObservableContext implements Computation.Context { ...@@ -186,7 +184,6 @@ class ObservableContext implements Computation.Context {
} }
} }
this.lastDelta = time - this.lastUpdated;
this.lastUpdated = time; this.lastUpdated = time;
return Scheduler.immediatePromise(); return Scheduler.immediatePromise();
...@@ -223,11 +220,10 @@ class ChunkerImpl implements Computation.Chunker { ...@@ -223,11 +220,10 @@ class ChunkerImpl implements Computation.Chunker {
private processedSinceUpdate = 0; private processedSinceUpdate = 0;
private updater: Computation.Context['update']; private updater: Computation.Context['update'];
private computeChunkSize() { private computeChunkSize(delta: number) {
const lastDelta = (this.context as ObservableContext).lastDelta || 0; if (!delta) return this.nextChunkSize;
if (!lastDelta) return this.nextChunkSize;
const rate = (this.context as ObservableContext).updateRate || DefaulUpdateRateMs; const rate = (this.context as ObservableContext).updateRate || DefaulUpdateRateMs;
const ret = Math.round(this.processedSinceUpdate * rate / lastDelta + 1); const ret = Math.round(this.processedSinceUpdate * rate / delta + 1);
this.processedSinceUpdate = 0; this.processedSinceUpdate = 0;
return ret; return ret;
} }
...@@ -246,17 +242,22 @@ class ChunkerImpl implements Computation.Chunker { ...@@ -246,17 +242,22 @@ class ChunkerImpl implements Computation.Chunker {
async process(nextChunk: (size: number) => number, update: (updater: Computation.Context['update']) => Promise<void> | void, nextChunkSize?: number) { async process(nextChunk: (size: number) => number, update: (updater: Computation.Context['update']) => Promise<void> | void, nextChunkSize?: number) {
if (typeof nextChunkSize !== 'undefined') this.setNextChunkSize(nextChunkSize); if (typeof nextChunkSize !== 'undefined') this.setNextChunkSize(nextChunkSize);
// track time for the actual computation and exclude the "update time"
let chunkStart = Computation.now();
let lastChunkSize: number; let lastChunkSize: number;
while ((lastChunkSize = nextChunk(this.getNextChunkSize())) > 0) { while ((lastChunkSize = nextChunk(this.getNextChunkSize())) > 0) {
this.processedSinceUpdate += lastChunkSize; this.processedSinceUpdate += lastChunkSize;
if (this.context.requiresUpdate) { if (this.context.requiresUpdate) {
let time = Computation.now();
await update(this.updater); await update(this.updater);
this.nextChunkSize = this.computeChunkSize(); this.nextChunkSize = this.computeChunkSize(time - chunkStart);
chunkStart = Computation.now();
} }
} }
if (this.context.requiresUpdate) { if (this.context.requiresUpdate) {
let time = Computation.now();
await update(this.updater); await update(this.updater);
this.nextChunkSize = this.computeChunkSize(); this.nextChunkSize = this.computeChunkSize(time - chunkStart);
} }
} }
......
...@@ -29,6 +29,23 @@ async function readData(path: string) { ...@@ -29,6 +29,23 @@ async function readData(path: string) {
} }
} }
function *test() {
yield 10;
return 15;
}
async function runIt<T>(itP: () => IterableIterator<T>) {
const it = itP();
let lastValue: T | undefined;
while(true) {
const { value, done } = it.next();
if (done) return value;
lastValue = value;
}
}
runIt(test).then(r => console.log('rerdasdasda', r))
export async function readCIF(path: string) { export async function readCIF(path: string) {
console.time('readData'); console.time('readData');
const input = await readData(path) const input = await readData(path)
......
...@@ -148,13 +148,14 @@ async function runCIF(input: string | Uint8Array) { ...@@ -148,13 +148,14 @@ async function runCIF(input: string | Uint8Array) {
export async function _cif() { export async function _cif() {
let path = `./examples/1grm_updated.cif`; let path = `./examples/1grm_updated.cif`;
// path = '../test/3j3q.cif' // lets have a relative path for big test files // path = '../test/3j3q.cif' // lets have a relative path for big test files
//path = 'e:/test/quick/3j3q_updated.cif';
const input = await readFileAsync(path, 'utf8') const input = await readFileAsync(path, 'utf8')
console.log('------------------'); console.log('------------------');
console.log('Text CIF:'); console.log('Text CIF:');
runCIF(input); runCIF(input);
path = `./examples/1cbs_full.bcif`; path = `./examples/1cbs_full.bcif`;
// const path = 'c:/test/quick/3j3q.cif';
const input2 = await readFileAsync(path) const input2 = await readFileAsync(path)
console.log('------------------'); console.log('------------------');
console.log('BinaryCIF:'); console.log('BinaryCIF:');
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment