From 41d2abe516669807cbab1729495c36b6eb4fd05e Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 7 Jul 2017 12:56:05 +0200 Subject: [PATCH] Do not compute a hash if it is not used (#30180) --- .../textfile/electron-browser/modelBuilder.ts | 20 ++++++++++++------- .../textfile/test/modelBuilder.test.ts | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/services/textfile/electron-browser/modelBuilder.ts b/src/vs/workbench/services/textfile/electron-browser/modelBuilder.ts index a5b043b6288..a0c61733a78 100644 --- a/src/vs/workbench/services/textfile/electron-browser/modelBuilder.ts +++ b/src/vs/workbench/services/textfile/electron-browser/modelBuilder.ts @@ -58,14 +58,18 @@ function optimizeStringMemory(buff: Buffer, s: string): string { class ModelLineBasedBuilder { + private computeHash: boolean; private hash: crypto.Hash; private buff: Buffer; private BOM: string; private lines: string[]; private currLineIndex: number; - constructor() { - this.hash = crypto.createHash('sha1'); + constructor(computeHash: boolean) { + this.computeHash = computeHash; + if (this.computeHash) { + this.hash = crypto.createHash('sha1'); + } this.BOM = ''; this.lines = []; this.currLineIndex = 0; @@ -84,12 +88,14 @@ class ModelLineBasedBuilder { for (let i = 0, len = lines.length; i < len; i++) { this.lines[this.currLineIndex++] = optimizeStringMemory(this.buff, lines[i]); } - this.hash.update(lines.join('\n') + '\n'); + if (this.computeHash) { + this.hash.update(lines.join('\n') + '\n'); + } } public finish(length: number, carriageReturnCnt: number, containsRTL: boolean, isBasicASCII: boolean): ModelBuilderResult { return { - hash: this.hash.digest('hex'), + hash: this.computeHash ? this.hash.digest('hex') : null, value: { BOM: this.BOM, lines: this.lines, @@ -123,7 +129,7 @@ export class ModelBuilder { public static fromStringStream(stream: IStringStream): TPromise { return new TPromise((c, e, p) => { let done = false; - let builder = new ModelBuilder(); + let builder = new ModelBuilder(false); stream.on('data', (chunk) => { builder.acceptChunk(chunk); @@ -145,11 +151,11 @@ export class ModelBuilder { }); } - constructor() { + constructor(computeHash: boolean) { this.leftoverPrevChunk = ''; this.leftoverEndsInCR = false; this.totalCRCount = 0; - this.lineBasedBuilder = new ModelLineBasedBuilder(); + this.lineBasedBuilder = new ModelLineBasedBuilder(computeHash); this.totalLength = 0; this.containsRTL = false; this.isBasicASCII = true; diff --git a/src/vs/workbench/services/textfile/test/modelBuilder.test.ts b/src/vs/workbench/services/textfile/test/modelBuilder.test.ts index 283a3ce4803..6274c564ae6 100644 --- a/src/vs/workbench/services/textfile/test/modelBuilder.test.ts +++ b/src/vs/workbench/services/textfile/test/modelBuilder.test.ts @@ -15,7 +15,7 @@ export function testModelBuilder(chunks: string[], opts: ITextModelCreationOptio let expectedTextSource = RawTextSource.fromString(chunks.join('')); let expectedHash = computeHash(expectedTextSource); - let builder = new ModelBuilder(); + let builder = new ModelBuilder(true); for (let i = 0, len = chunks.length; i < len; i++) { builder.acceptChunk(chunks[i]); }