Back to THashMap, which is less memory hungry than LinkedHashMap and ensure locality by sorting things. Please note, actual VirtualFile implementation does have an effective hashCode implementation

This commit is contained in:
Maxim Shafirov
2012-04-09 20:09:57 +04:00
parent 553a73f16a
commit 81ab895c34
3 changed files with 26 additions and 10 deletions
@@ -33,8 +33,6 @@ import gnu.trove.THashMap;
import org.jdom.Element;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
/**
* @author anna
* Date: 20-Dec-2007
@@ -135,8 +133,7 @@ public class RefJavaManagerImpl extends RefJavaManager {
refPackage.accept(visitor);
}
}
final Map<PsiAnchor, RefElement> refTable = myRefManager.getRefTable();
for (RefElement refElement : refTable.values()) {
for (RefElement refElement : myRefManager.getSortedElements()) {
if (refElement instanceof RefClass) {
RefClass refClass = (RefClass)refElement;
RefMethod refDefaultConstructor = refClass.getDefaultConstructor();
@@ -120,6 +120,10 @@ public abstract class RefElementImpl extends RefEntityImpl implements RefElement
return myID.getContainingFile();
}
public VirtualFile getVirtualFile() {
return myID.getVirtualFile();
}
public SmartPsiElementPointer getPointer() {
return myID;
}
@@ -49,6 +49,7 @@ import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightElement;
import com.intellij.util.concurrency.JBReentrantReadWriteLock;
import com.intellij.util.concurrency.LockFactory;
import com.intellij.util.containers.ContainerUtil;
import gnu.trove.THashMap;
import org.jdom.Element;
import org.jetbrains.annotations.Nullable;
@@ -63,7 +64,7 @@ public class RefManagerImpl extends RefManager {
private final Project myProject;
private AnalysisScope myScope;
private RefProject myRefProject;
private Map<PsiAnchor, RefElement> myRefTable;
private THashMap<PsiAnchor, RefElement> myRefTable;
private THashMap<Module, RefModule> myModules;
private final ProjectIterator myProjectIterator;
@@ -87,7 +88,7 @@ public class RefManagerImpl extends RefManager {
myContext = context;
myPsiManager = PsiManager.getInstance(project);
myRefProject = new RefProjectImpl(this);
myRefTable = new LinkedHashMap<PsiAnchor, RefElement>();
myRefTable = new THashMap<PsiAnchor, RefElement>();
myProjectIterator = new ProjectIterator();
for (InspectionExtensionsFactory factory : Extensions.getExtensions(InspectionExtensionsFactory.EP_NAME)) {
final RefManagerExtension extension = factory.createRefManagerExtension(this);
@@ -101,8 +102,7 @@ public class RefManagerImpl extends RefManager {
public void iterate(RefVisitor visitor) {
myLock.readLock().lock();
try {
final Map<PsiAnchor, RefElement> refTable = getRefTable();
for (RefElement refElement : refTable.values()) {
for (RefElement refElement : getSortedElements()) {
refElement.accept(visitor);
}
if (myModules != null) {
@@ -299,10 +299,25 @@ public class RefManagerImpl extends RefManager {
return myRefProject;
}
public Map<PsiAnchor, RefElement> getRefTable() {
public THashMap<PsiAnchor, RefElement> getRefTable() {
return myRefTable;
}
public ArrayList<RefElement> getSortedElements() {
ArrayList<RefElement> answer = new ArrayList<RefElement>(myRefTable.values());
ContainerUtil.quickSort(answer, new Comparator<RefElement>() {
@Override
public int compare(RefElement o1, RefElement o2) {
VirtualFile v1 = ((RefElementImpl)o1).getVirtualFile();
VirtualFile v2 = ((RefElementImpl)o2).getVirtualFile();
return (v1 != null ? v1.hashCode() : 0) - (v2 != null ? v2.hashCode() : 0);
}
});
return answer;
}
@Override
public PsiManager getPsiManager() {
return myPsiManager;
@@ -311,7 +326,7 @@ public class RefManagerImpl extends RefManager {
public void removeReference(RefElement refElem) {
myLock.writeLock().lock();
try {
final Map<PsiAnchor, RefElement> refTable = getRefTable();
final THashMap<PsiAnchor, RefElement> refTable = getRefTable();
final PsiElement element = refElem.getElement();
final RefManagerExtension extension = element != null ? getExtension(element.getLanguage()) : null;
if (extension != null) {