src/vs/workbench/services/timer/browser/timerService.ts/AbstractTimerService/constructor
class AbstractTimerService:	constructor(
		@ILifecycleService private readonly _lifecycleService: ILifecycleService,
		@IWorkspaceContextService private readonly _contextService: IWorkspaceContextService,
		@IExtensionService private readonly _extensionService: IExtensionService,
		@IUpdateService private readonly _updateService: IUpdateService,
		@IPaneCompositePartService private readonly _paneCompositeService: IPaneCompositePartService,
		@IEditorService private readonly _editorService: IEditorService,
		@IAccessibilityService private readonly _accessibilityService: IAccessibilityService,
		@ITelemetryService private readonly _telemetryService: ITelemetryService,
		@IWorkbenchLayoutService layoutService: IWorkbenchLayoutService
	) {
		Promise.all([
			this._extensionService.whenInstalledExtensionsRegistered(), // extensions registered
			_lifecycleService.when(LifecyclePhase.Restored),			// workbench created and parts restored
			layoutService.whenRestored									// layout restored (including visible editors resolved)
		]).then(() => {
			// set perf mark from renderer
			this.setPerformanceMarks('renderer', perf.getMarks());
			return this._computeStartupMetrics();
		}).then(metrics => {
			this._startupMetrics = metrics;
			this._reportStartupTimes(metrics);
			this._barrier.open();
		});


		this.perfBaseline = this._barrier.wait()
			.then(() => this._lifecycleService.when(LifecyclePhase.Eventually))
			.then(() => timeout(this._startupMetrics!.timers.ellapsedRequire))
			.then(() => {

				// we use fibonacci numbers to have a performance baseline that indicates
				// how slow/fast THIS machine actually is.
				const sw = new StopWatch(true);
				let tooSlow = false;
				function fib(n: number): number {
					if (tooSlow) {
						return 0;
					}
					if (sw.elapsed() >= 1000) {
						tooSlow = true;
					}
					if (n <= 2) {
						return n;
					}
					return fib(n - 1) + fib(n - 2);
				}

				// the following operation took ~16ms (one frame at 64FPS) to complete on my machine. We derive performance observations
				// from that. We also bail if that took too long (>1s)
				sw.reset();
				fib(24);
				const value = Math.round(sw.elapsed());

				return (tooSlow ? -1 : value);
			});
	}