From 71e7e41b7cea8cb257e34adbdbaf7e095909cd9a Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Mon, 6 Feb 2012 19:42:48 +0400 Subject: [PATCH] Don't check .isFile() too often, don't call .list() too often --- .../intellij/core/CoreJavaFileManager.java | 26 ++++++++++++------- .../vfs/local/CoreLocalVirtualFile.java | 17 ++++++++---- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java b/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java index 845339e66d7a..06b1eb6a65f5 100644 --- a/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java +++ b/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java @@ -27,14 +27,12 @@ import com.intellij.psi.impl.file.impl.JavaFileManager; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.CollectionQuery; import com.intellij.util.Query; +import com.intellij.util.containers.ConcurrentFactoryMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.util.*; /** * @author yole @@ -45,6 +43,19 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager private final CoreLocalFileSystem myLocalFileSystem; private final CoreJarFileSystem myJarFileSystem; private final List myClasspath = new ArrayList(); + + private final Map myClasspathRoots = new ConcurrentFactoryMap() { + @Override + protected VirtualFile create(File key) { + if (key.isFile()) { + return myJarFileSystem.findFileByPath(key.getPath() + "!/"); + } + else { + return myLocalFileSystem.findFileByPath(key.getPath()); + } + } + }; + private final PsiManager myPsiManager; public CoreJavaFileManager(PsiManager psiManager, CoreLocalFileSystem localFileSystem, CoreJarFileSystem jarFileSystem) { @@ -94,12 +105,7 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager @Nullable private VirtualFile findRootInClassPathEntry(File classpathEntry) { - if (classpathEntry.isFile()) { - return myJarFileSystem.findFileByPath(classpathEntry.getPath() + "!/"); - } - else { - return myLocalFileSystem.findFileByPath(classpathEntry.getPath()); - } + return myClasspathRoots.get(classpathEntry); } @Override diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java index 067fe61a8266..5b330f4c3772 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java @@ -31,6 +31,7 @@ import java.util.List; public class CoreLocalVirtualFile extends VirtualFile { private final CoreLocalFileSystem myFileSystem; private final File myIoFile; + private VirtualFile[] myChildren; public CoreLocalVirtualFile(CoreLocalFileSystem fileSystem, File ioFile) { myFileSystem = fileSystem; @@ -77,12 +78,18 @@ public class CoreLocalVirtualFile extends VirtualFile { @Override public VirtualFile[] getChildren() { - List result = new ArrayList(); - final File[] files = myIoFile.listFiles(); - for (File file : files) { - result.add(new CoreLocalVirtualFile(myFileSystem, file)); + VirtualFile[] answer = myChildren; + if (answer == null) { + List result = new ArrayList(); + final File[] files = myIoFile.listFiles(); + for (File file : files) { + result.add(new CoreLocalVirtualFile(myFileSystem, file)); + } + answer = result.toArray(new VirtualFile[result.size()]); + + myChildren = answer; } - return result.toArray(new VirtualFile[result.size()]); + return answer; } @NotNull