Change:
apply the patch that logs fs calls which is included below run open a folder and open a single css file don't modify it (i.e. avoid hot exit) and reload the window <details<summaryPatch</summary</detailsObserve the following fs calls that occur before the first editor rendering: IMHO the following fs calls should be postponed: [ ] [ ] [ ] [x] I also noticed that we read the following files twice: [ ]
I have no clue what we use install source for, but lots of digging reveals this commit:
Updating the list - is only read once.
is read twice because First time during initialising configuration without user tasks User tasks is read later when there is an idle time - by reloading user configuration - during which settings and tasks files are read.
Install source is a common telemetry property. It can be set after installing VS Code. It came as an ask from Anaconda, to know how many installations came from them. We decided to go with creating a new file rather than updating existing files, to avoid scenarios where we'd break important files (eg or ). I don't have great ideas to work around this other than refactoring the code until the first telemetry event gets submitted, which is still pretty early. Will ask around to learn whether this common telemetry property is still in use.
is gone!
Tasks and Launches are part of Config and they are accessed sync from config service. In order to prevent reading these files during start up we should loading them until they are needed. (probably workbench restored phase) an assertion to make sure no component is reading them until then
This needs considerable refactoring and I do not think it is worth a change for the gain given that these files are resolved in parallel. Hence marking this as no fix.

Discussion:
this.settingsResource = settingsResource; this.tasksResource = tasksResource; this.configurationParseOptions = configurationParseOptions; <ins> return this.doReset(); } private async doReset(settingsConfiguration?: ConfigurationModel): Promise<ConfigurationModel> { </ins> const folder = this.uriIdentityService.extUri.dirname(this.settingsResource); const standAloneConfigurationResources: [string, URI][] = this.tasksResource ? [[TASKS_CONFIGURATION_KEY, this.tasksResource]] : []; const fileServiceBasedConfiguration = new FileServiceBasedConfiguration(folder.toString(), this.settingsResource, standAloneConfigurationResources, this.configurationParseOptions, this.fileService, this.uriIdentityService, this.logService); <del> const configurationModel = await fileServiceBasedConfiguration.loadConfiguration(); </del> <ins> const configurationModel = await fileServiceBasedConfiguration.loadConfiguration(settingsConfiguration); </ins> this.userConfiguration.value = fileServiceBasedConfiguration; // Check for value because userConfiguration might have been disposed.

return this.userConfiguration.value!.loadConfiguration(); } <del> async reload(): Promise<ConfigurationModel> { </del> <ins> async reload(settingsConfiguration?: ConfigurationModel): Promise<ConfigurationModel> { </ins> if (this.hasTasksLoaded) { return this.userConfiguration.value!.loadConfiguration(); } <del> return this.reset(this.settingsResource, this.tasksResource, this.configurationParseOptions); </del> <ins> return this.doReset(settingsConfiguration); </ins> } reparse(parseOptions?: Partial<ConfigurationParseOptions>): ConfigurationModel {

), () => undefined, 100)(() => this._onDidChange.fire())); } <del> async resolveContents(): Promise<[string | undefined, [string, string | undefined][]]> { </del> <ins> async resolveContents(donotResolveSettings?: boolean): Promise<[string | undefined, [string, string | undefined][]]> { </ins> const resolveContents = async (resources: URI[]): Promise<(string | undefined)[]> => { return Promise.all(resources.map(async resource => {

}; const [[settingsContent], standAloneConfigurationContents] = await Promise.all([ <del> resolveContents([this.settingsResource]), </del> <ins> donotResolveSettings ? Promise.resolve([undefined]) : resolveContents([this.settingsResource]), </ins> resolveContents(this.standAloneConfigurationResources.map(([, resource]) => resource)), ]); return [settingsContent, standAloneConfigurationContents.map((content, index) => ([this.standAloneConfigurationResources[index][0], content]))]; } <del> async loadConfiguration(): Promise<ConfigurationModel> { </del> <ins> async loadConfiguration(settingsConfiguration?: ConfigurationModel): Promise<ConfigurationModel> { </ins> <del> const [settingsContent, standAloneConfigurationContents] = await this.resolveContents(); </del> <ins> const [settingsContent, standAloneConfigurationContents] = await this.resolveContents(!!settingsConfiguration); </ins> // reset this._standAloneConfigurations = [];

} // Consolidate (support *.json files in the workspace settings folder) <del> this.consolidate(); </del> <ins> this.consolidate(settingsConfiguration); </ins> return this._cache; }

return this._cache; } <del> private consolidate(): void { this._cache = this._folderSettingsModelParser.configurationModel.merge(...this._standAloneConfigurations); </del> <ins> private consolidate(settingsConfiguration?: ConfigurationModel): void { this._cache = (settingsConfiguration ?? this._folderSettingsModelParser.configurationModel).merge(...this._standAloneConfigurations); </ins> } private handleFileChangesEvent(event: FileChangesEvent): boolean {

if (!this.localUserConfiguration.hasTasksLoaded) { // Reload local user configuration again to load user tasks <del> this._register(runWhenIdle(() => this.reloadLocalUserConfiguration())); </del> <ins> this._register(runWhenIdle(() => this.reloadLocalUserConfiguration(false, this._configuration.localUserConfiguration))); </ins> } }

return { local, remote }; } <del> async reloadLocalUserConfiguration(donotTrigger?: boolean): Promise<ConfigurationModel> { const model = await this.localUserConfiguration.reload(); </del> <ins> async reloadLocalUserConfiguration(donotTrigger?: boolean, settingsConfiguration?: ConfigurationModel): Promise<ConfigurationModel> { const model = await this.localUserConfiguration.reload(settingsConfiguration); </ins> if (!donotTrigger) { this.onLocalUserConfigurationChanged(model); }