From 3923fd074ef10539e0f10160d8334ee323f2992f Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Wed, 24 Aug 2011 20:22:37 +0200 Subject: [PATCH] reduce number of "VFS.findFileByUrl()" calls during compilation --- .../impl/TranslatingCompilerFilesMonitor.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java b/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java index f1e89169f5fa..ff0f6824eec7 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java @@ -83,6 +83,7 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { private static final String OUTPUT_ROOTS_FILENAME = "output_roots.dat"; private static final FileAttribute ourSourceFileAttribute = new FileAttribute("_make_source_file_info_", 3); private static final FileAttribute ourOutputFileAttribute = new FileAttribute("_make_output_file_info_", 3); + private static final Key> SOURCE_FILES_CACHE = Key.create("_source_url_to_vfile_cache_"); private final Object myDataLock = new Object(); private final TIntObjectHashMap mySourcesToRecompile = new TIntObjectHashMap(); // ProjectId->set of source file paths @@ -221,10 +222,20 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { final VirtualFileManager vfm = VirtualFileManager.getInstance(); final LocalFileSystem lfs = LocalFileSystem.getInstance(); final List zombieEntries = new ArrayList(); + final Map srcFileCache = getFileCache(context); for (String outputPath : outputsToDelete.keySet()) { final SourceUrlClassNamePair classNamePair = outputsToDelete.get(outputPath); final String sourceUrl = classNamePair.getSourceUrl(); - final VirtualFile srcFile = vfm.findFileByUrl(sourceUrl); + + final VirtualFile srcFile; + if (srcFileCache.containsKey(sourceUrl)) { + srcFile = srcFileCache.get(sourceUrl); + } + else { + srcFile = vfm.findFileByUrl(sourceUrl); + srcFileCache.put(sourceUrl, srcFile); + } + final boolean sourcePresent = srcFile != null; if (sourcePresent) { if (!compiler.isCompilableFile(srcFile, context)) { @@ -276,6 +287,14 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } } + private static Map getFileCache(CompileContext context) { + Map cache = context.getUserData(SOURCE_FILES_CACHE); + if (cache == null) { + context.putUserData(SOURCE_FILES_CACHE, cache = new HashMap()); + } + return cache; + } + private static int getFileId(final VirtualFile file) { return FileBasedIndex.getFileId(file); }