diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/MemberLookupHelper.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/MemberLookupHelper.cs index a6d04977c9..f36fb8b44a 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/MemberLookupHelper.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/MemberLookupHelper.cs @@ -87,6 +87,7 @@ namespace ICSharpCode.SharpDevelop.Dom //Dictionary overrideDict = new Dictionary(); ParameterListComparer parameterListComparer = new ParameterListComparer(); + parameterListComparer.UseCachedHashes = true; HashSet handledMethods = new HashSet(parameterListComparer); Dictionary overrideMethodDict = new Dictionary(parameterListComparer); IMember nonMethodOverride = null; diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ParameterListComparer.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ParameterListComparer.cs index c4e2b15b58..0b504fda01 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ParameterListComparer.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ParameterListComparer.cs @@ -10,10 +10,32 @@ namespace ICSharpCode.SharpDevelop.Dom { public class ParameterListComparer : IEqualityComparer { + Dictionary cachedHashes; + + /// + /// Gets/Sets whether to cache hashcodes. This can improve performance for + /// algorithms that repeatedly request the hash of a parameter list. + /// + /// + /// This class is thread-safe only when not using cached hashes. + /// Also, cached hashes may cause a memory leak when the ParameterListComparer + /// instance is kept alive. + /// + public bool UseCachedHashes { + get { + return cachedHashes != null; + } + set { + cachedHashes = value ? new Dictionary() : null; + } + } + public bool Equals(IMethod x, IMethod y) { - if (GetHashCode(x) != GetHashCode(y)) - return false; + if (cachedHashes != null) { + if (GetHashCode(x) != GetHashCode(y)) + return false; + } var paramsX = x.Parameters; var paramsY = y.Parameters; if (paramsX.Count != paramsY.Count) @@ -31,12 +53,10 @@ namespace ICSharpCode.SharpDevelop.Dom return true; } - Dictionary cachedHashes = new Dictionary(); - public int GetHashCode(IMethod obj) { int hashCode; - if (cachedHashes.TryGetValue(obj, out hashCode)) + if (cachedHashes != null && cachedHashes.TryGetValue(obj, out hashCode)) return hashCode; hashCode = obj.TypeParameters.Count; unchecked { @@ -49,7 +69,8 @@ namespace ICSharpCode.SharpDevelop.Dom } } } - cachedHashes[obj] = hashCode; + if (cachedHashes != null) + cachedHashes[obj] = hashCode; return hashCode; } }