From ca09996485dec31e50d0c33fd0f5bf3b86a6e086 Mon Sep 17 00:00:00 2001 From: Igor Emets Date: Tue, 8 Jan 2019 16:54:50 +0200 Subject: [PATCH] fix(perf): add cache for fs calls (#908) --- src/compiler.ts | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index d910f99b57..a47a867126 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -131,6 +131,7 @@ export function createCompiler(configs: ConfigSet): TsCompiler { ...serviceHostDebugCtx, [LogContexts.logLevel]: LogLevels.trace, } + const serviceHost = { getScriptFileNames: () => Object.keys(memoryCache.versions), getScriptVersion: (fileName: string) => { @@ -157,11 +158,11 @@ export function createCompiler(configs: ConfigSet): TsCompiler { } return ts.ScriptSnapshot.fromString(contents) }, - fileExists: ts.sys.fileExists, - readFile: logger.wrap(serviceHostTraceCtx, 'readFile', ts.sys.readFile), - readDirectory: ts.sys.readDirectory, - getDirectories: ts.sys.getDirectories, - directoryExists: ts.sys.directoryExists, + fileExists: memoize(ts.sys.fileExists), + readFile: logger.wrap(serviceHostTraceCtx, 'readFile', memoize(ts.sys.readFile)), + readDirectory: memoize(ts.sys.readDirectory), + getDirectories: memoize(ts.sys.getDirectories), + directoryExists: memoize(ts.sys.directoryExists), getNewLine: () => '\n', getCurrentDirectory: () => cwd, getCompilationSettings: () => compilerOptions, @@ -224,6 +225,22 @@ export function createCompiler(configs: ConfigSet): TsCompiler { return { cwd, compile, getTypeInfo, extensions, cachedir, ts } } +type AnyFn = (...args: any[]) => any +function memoize(fn: T): T { + const cache = new Map() + + return ((arg: string) => { + const entry = cache.get(arg) + if (entry !== undefined) { + return entry + } + + const res = fn(arg) + cache.set(arg, res) + return res + }) as T +} + /** * Internal source output. */