Skip to content

Commit 212bb1a

Browse files
authored
compute performance baseline in a webworker (microsoft#172405)
* compute performance baseline in a webworker microsoft#172239 * make build happy, better change overall
1 parent da4e6a6 commit 212bb1a

File tree

2 files changed

+41
-20
lines changed

2 files changed

+41
-20
lines changed

src/vs/base/browser/defaultWorkerFactory.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ import { IWorker, IWorkerCallback, IWorkerFactory, logOnceWebWorkerWarning } fro
99

1010
const ttPolicy = window.trustedTypes?.createPolicy('defaultWorkerFactory', { createScriptURL: value => value });
1111

12+
export function createBlobWorker(blobUrl: string, options?: WorkerOptions): Worker {
13+
if (!blobUrl.startsWith('blob:')) {
14+
throw new URIError('Not a blob-url: ' + blobUrl);
15+
}
16+
return new Worker(ttPolicy ? ttPolicy.createScriptURL(blobUrl) as unknown as string : blobUrl, options);
17+
}
18+
1219
function getWorker(label: string): Worker | Promise<Worker> {
1320
// Option for hosts to overwrite the worker script (used in the standalone editor)
1421
if (globals.MonacoEnvironment) {

src/vs/workbench/services/timer/browser/timerService.ts

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ import { Barrier, timeout } from 'vs/base/common/async';
1616
import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService';
1717
import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite';
1818
import { ViewContainerLocation } from 'vs/workbench/common/views';
19-
import { StopWatch } from 'vs/base/common/stopwatch';
2019
import { TelemetryTrustedValue } from 'vs/platform/telemetry/common/telemetryUtils';
2120
import { isWeb } from 'vs/base/common/platform';
21+
import { createBlobWorker } from 'vs/base/browser/defaultWorkerFactory';
2222

2323
/* __GDPR__FRAGMENT__
2424
"IMemoryInfo" : {
@@ -518,28 +518,42 @@ export abstract class AbstractTimerService implements ITimerService {
518518

519519
// we use fibonacci numbers to have a performance baseline that indicates
520520
// how slow/fast THIS machine actually is.
521-
const sw = new StopWatch(true);
522-
let tooSlow = false;
523-
function fib(n: number): number {
524-
if (tooSlow) {
525-
return 0;
526-
}
527-
if (sw.elapsed() >= 1000) {
528-
tooSlow = true;
529-
}
530-
if (n <= 2) {
531-
return n;
521+
522+
const jsSrc = (function computeBaseline(this: WindowOrWorkerGlobalScope) {
523+
// the following operation took ~16ms (one frame at 64FPS) to complete on my machine. We derive performance observations
524+
// from that. We also bail if that took too long (>1s)
525+
let tooSlow = false;
526+
function fib(n: number): number {
527+
if (tooSlow) {
528+
return 0;
529+
}
530+
if (performance.now() - t1 >= 1000) {
531+
tooSlow = true;
532+
}
533+
if (n <= 2) {
534+
return n;
535+
}
536+
return fib(n - 1) + fib(n - 2);
532537
}
533-
return fib(n - 1) + fib(n - 2);
534-
}
535538

536-
// the following operation took ~16ms (one frame at 64FPS) to complete on my machine. We derive performance observations
537-
// from that. We also bail if that took too long (>1s)
538-
sw.reset();
539-
fib(24);
540-
const value = Math.round(sw.elapsed());
539+
const t1 = performance.now();
540+
fib(24);
541+
const value = Math.round(performance.now() - t1);
542+
postMessage({ value: tooSlow ? -1 : value });
543+
544+
}).toString();
545+
546+
const blob = new Blob([`${jsSrc};\ncomputeBaseline();`], { type: 'application/javascript' });
547+
const blobUrl = URL.createObjectURL(blob);
548+
549+
const worker = createBlobWorker(blobUrl, { name: 'perfBaseline' });
550+
return new Promise<number>(resolve => {
551+
worker.onmessage = e => resolve(e.data.value);
541552

542-
return (tooSlow ? -1 : value);
553+
}).finally(() => {
554+
worker.terminate();
555+
URL.revokeObjectURL(blobUrl);
556+
});
543557
});
544558
}
545559

0 commit comments

Comments
 (0)