diff --git a/src/vs/platform/ipc/electron-sandbox/sharedProcessService.ts b/src/vs/platform/ipc/electron-sandbox/sharedProcessService.ts index 87539339df7..667702d1b04 100644 --- a/src/vs/platform/ipc/electron-sandbox/sharedProcessService.ts +++ b/src/vs/platform/ipc/electron-sandbox/sharedProcessService.ts @@ -12,6 +12,7 @@ import { generateUuid } from 'vs/base/common/uuid'; import { ILogService } from 'vs/platform/log/common/log'; import { Disposable } from 'vs/base/common/lifecycle'; import { ISharedProcessService } from 'vs/platform/ipc/electron-sandbox/services'; +import { mark } from 'vs/base/common/performance'; export class SharedProcessService extends Disposable implements ISharedProcessService { @@ -30,6 +31,7 @@ export class SharedProcessService extends Disposable implements ISharedProcessSe private async connect(): Promise { this.logService.trace('Renderer->SharedProcess#connect'); + mark('code/willConnectSharedProcess'); // Ask to create message channel inside the window // and send over a UUID to correlate the response @@ -42,6 +44,7 @@ export class SharedProcessService extends Disposable implements ISharedProcessSe const onMessageChannelResult = Event.fromDOMEventEmitter<{ nonce: string, port: MessagePort, source: unknown }>(window, 'message', (e: MessageEvent) => ({ nonce: e.data, port: e.ports[0], source: e.source })); const { port } = await Event.toPromise(Event.once(Event.filter(onMessageChannelResult, e => e.nonce === nonce && e.source === window))); + mark('code/didConnectSharedProcess'); this.logService.trace('Renderer->SharedProcess#connect: connection established'); return this._register(new MessagePortClient(port, `window:${this.nativeHostService.windowId}`)); diff --git a/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts b/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts index 4b810831bab..aca91d0adde 100644 --- a/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts +++ b/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts @@ -177,6 +177,7 @@ class PerfModelContentProvider implements ITextModelContentProvider { table.push(['init storage (global & workspace)', metrics.timers.ellapsedStorageInit, '[renderer]', undefined]); table.push(['require & init workspace storage', metrics.timers.ellapsedWorkspaceStorageInit, '[renderer]', undefined]); table.push(['init workspace service', metrics.timers.ellapsedWorkspaceServiceInit, '[renderer]', undefined]); + table.push(['connect to shared process', metrics.timers.ellapsedSharedProcesConnectionCreate, '[renderer]', undefined]); if (isWeb) { table.push(['init settings and global state from settings sync service', metrics.timers.ellapsedRequiredUserDataInit, '[renderer]', undefined]); table.push(['init keybindings, snippets & extensions from settings sync service', metrics.timers.ellapsedOtherUserDataInit, '[renderer]', undefined]); diff --git a/src/vs/workbench/services/timer/browser/timerService.ts b/src/vs/workbench/services/timer/browser/timerService.ts index 324de644b65..38865803a93 100644 --- a/src/vs/workbench/services/timer/browser/timerService.ts +++ b/src/vs/workbench/services/timer/browser/timerService.ts @@ -232,6 +232,14 @@ export interface IStartupMetrics { */ readonly ellapsedWorkspaceServiceInit: number; + /** + * The time it took to connect to the shared process. + * + * * Happens in the renderer-process + * * Measured with the `willConnectSharedProcess` and `didConnectSharedProcess` performance marks. + */ + readonly ellapsedSharedProcesConnectionCreate: number; + /** * The time it took to initialize required user data (settings & global state) using settings sync service. * @@ -524,6 +532,7 @@ export abstract class AbstractTimerService implements ITimerService { ellapsedRequire: this._marks.getDuration('code/willLoadWorkbenchMain', 'code/didLoadWorkbenchMain'), ellapsedWaitForShellEnv: this._marks.getDuration('code/willWaitForShellEnv', 'code/didWaitForShellEnv'), ellapsedStorageInit: this._marks.getDuration('code/willInitStorage', 'code/didInitStorage'), + ellapsedSharedProcesConnectionCreate: this._marks.getDuration('code/willConnectSharedProcess', 'code/didConnectSharedProcess'), ellapsedWorkspaceStorageInit: this._marks.getDuration('code/willInitWorkspaceStorage', 'code/didInitWorkspaceStorage'), ellapsedWorkspaceServiceInit: this._marks.getDuration('code/willInitWorkspaceService', 'code/didInitWorkspaceService'), ellapsedRequiredUserDataInit: this._marks.getDuration('code/willInitRequiredUserData', 'code/didInitRequiredUserData'),