提交 4ec1f37f 编写于 作者: M Manish Vasani

Remove caching of declaring syntax references for symbols in analyzer driver -...

Remove caching of declaring syntax references for symbols in analyzer driver - this was done as part of addressing some performance regressions, but the subsequent tuning should make the original change redundant.

Fixes #7156
上级 4577bd48
...@@ -814,23 +814,10 @@ public override ImmutableArray<SyntaxReference> DeclaringSyntaxReferences ...@@ -814,23 +814,10 @@ public override ImmutableArray<SyntaxReference> DeclaringSyntaxReferences
{ {
get get
{ {
// PERF: Declaring references are cached for compilations with event queue. return SyntaxReferences;
return this.DeclaringCompilation?.EventQueue != null ? GetCachedDeclaringReferences() : this.SyntaxReferences;
} }
} }
private ImmutableArray<SyntaxReference> GetCachedDeclaringReferences()
{
ImmutableArray<SyntaxReference> declaringReferences;
if (!Diagnostics.AnalyzerDriver.TryGetCachedDeclaringReferences(this, this.DeclaringCompilation, out declaringReferences))
{
declaringReferences = this.SyntaxReferences;
Diagnostics.AnalyzerDriver.CacheDeclaringReferences(this, this.DeclaringCompilation, declaringReferences);
}
return declaringReferences;
}
#endregion #endregion
#region Members #region Members
......
...@@ -111,23 +111,10 @@ public override ImmutableArray<SyntaxReference> DeclaringSyntaxReferences ...@@ -111,23 +111,10 @@ public override ImmutableArray<SyntaxReference> DeclaringSyntaxReferences
{ {
get get
{ {
// PERF: Declaring references are cached for compilations with event queue. return ComputeDeclaringReferencesCore();
return this.DeclaringCompilation?.EventQueue != null ? GetCachedDeclaringReferences() : ComputeDeclaringReferencesCore();
} }
} }
private ImmutableArray<SyntaxReference> GetCachedDeclaringReferences()
{
ImmutableArray<SyntaxReference> declaringReferences;
if (!Diagnostics.AnalyzerDriver.TryGetCachedDeclaringReferences(this, this.DeclaringCompilation, out declaringReferences))
{
declaringReferences = ComputeDeclaringReferencesCore();
Diagnostics.AnalyzerDriver.CacheDeclaringReferences(this, this.DeclaringCompilation, declaringReferences);
}
return declaringReferences;
}
private ImmutableArray<SyntaxReference> ComputeDeclaringReferencesCore() private ImmutableArray<SyntaxReference> ComputeDeclaringReferencesCore()
{ {
// SyntaxReference in the namespace declaration points to the name node of the namespace decl node not // SyntaxReference in the namespace declaration points to the name node of the namespace decl node not
......
...@@ -321,11 +321,6 @@ public async Task OnCompilationEventProcessedAsync(CompilationEvent compilationE ...@@ -321,11 +321,6 @@ public async Task OnCompilationEventProcessedAsync(CompilationEvent compilationE
{ {
UpdateEventsMap_NoLock(compilationEvent, add: false); UpdateEventsMap_NoLock(compilationEvent, add: false);
} }
if (symbolDeclaredEvent != null)
{
AnalyzerDriver.RemoveCachedDeclaringReferences(symbolDeclaredEvent.Symbol, symbolDeclaredEvent.Compilation);
}
} }
/// <summary> /// <summary>
......
...@@ -20,16 +20,9 @@ internal class CompilationData ...@@ -20,16 +20,9 @@ internal class CompilationData
/// </summary> /// </summary>
private readonly Dictionary<SyntaxTree, SemanticModel> _semanticModelsMap; private readonly Dictionary<SyntaxTree, SemanticModel> _semanticModelsMap;
/// <summary>
/// Cached syntax references for a symbol for the lifetime of symbol declared event.
/// PERF: This cache reduces allocations for computing declaring syntax references for a symbol.
/// </summary>
private readonly Dictionary<ISymbol, ImmutableArray<SyntaxReference>> _symbolDeclarationsMap;
public CompilationData(Compilation comp) public CompilationData(Compilation comp)
{ {
_semanticModelsMap = new Dictionary<SyntaxTree, SemanticModel>(); _semanticModelsMap = new Dictionary<SyntaxTree, SemanticModel>();
_symbolDeclarationsMap = new Dictionary<ISymbol, ImmutableArray<SyntaxReference>>();
this.SuppressMessageAttributeState = new SuppressMessageAttributeState(comp); this.SuppressMessageAttributeState = new SuppressMessageAttributeState(comp);
this.DeclarationAnalysisDataMap = new Dictionary<SyntaxReference, DeclarationAnalysisData>(); this.DeclarationAnalysisDataMap = new Dictionary<SyntaxReference, DeclarationAnalysisData>();
} }
...@@ -47,8 +40,7 @@ public SemanticModel GetOrCreateCachedSemanticModel(SyntaxTree tree, Compilation ...@@ -47,8 +40,7 @@ public SemanticModel GetOrCreateCachedSemanticModel(SyntaxTree tree, Compilation
return model; return model;
} }
} }
model = compilation.GetSemanticModel(tree); model = compilation.GetSemanticModel(tree);
// Invoke GetDiagnostics to populate the compilation's CompilationEvent queue. // Invoke GetDiagnostics to populate the compilation's CompilationEvent queue.
...@@ -69,36 +61,6 @@ public bool RemoveCachedSemanticModel(SyntaxTree tree) ...@@ -69,36 +61,6 @@ public bool RemoveCachedSemanticModel(SyntaxTree tree)
return _semanticModelsMap.Remove(tree); return _semanticModelsMap.Remove(tree);
} }
} }
public bool TryGetCachedDeclaringReferences(ISymbol symbol, out ImmutableArray<SyntaxReference> declaringReferences)
{
lock (_symbolDeclarationsMap)
{
if (!_symbolDeclarationsMap.TryGetValue(symbol, out declaringReferences))
{
declaringReferences = default(ImmutableArray<SyntaxReference>);
return false;
}
return true;
}
}
public void CacheDeclaringReferences(ISymbol symbol, ImmutableArray<SyntaxReference> declaringReferences)
{
lock (_symbolDeclarationsMap)
{
_symbolDeclarationsMap[symbol] = declaringReferences;
}
}
public bool RemoveCachedDeclaringReferences(ISymbol symbol)
{
lock (_symbolDeclarationsMap)
{
return _symbolDeclarationsMap.Remove(symbol);
}
}
} }
internal class DeclarationAnalysisData internal class DeclarationAnalysisData
...@@ -166,24 +128,5 @@ public static bool RemoveCachedSemanticModel(SyntaxTree tree, Compilation compil ...@@ -166,24 +128,5 @@ public static bool RemoveCachedSemanticModel(SyntaxTree tree, Compilation compil
return s_compilationDataCache.TryGetValue(compilation, out compilationData) && return s_compilationDataCache.TryGetValue(compilation, out compilationData) &&
compilationData.RemoveCachedSemanticModel(tree); compilationData.RemoveCachedSemanticModel(tree);
} }
public static bool TryGetCachedDeclaringReferences(ISymbol symbol, Compilation compilation, out ImmutableArray<SyntaxReference> declaringReferences)
{
var compilationData = GetOrCreateCachedCompilationData(compilation);
return compilationData.TryGetCachedDeclaringReferences(symbol, out declaringReferences);
}
public static void CacheDeclaringReferences(ISymbol symbol, Compilation compilation, ImmutableArray<SyntaxReference> declaringReferences)
{
var compilationData = GetOrCreateCachedCompilationData(compilation);
compilationData.CacheDeclaringReferences(symbol, declaringReferences);
}
public static bool RemoveCachedDeclaringReferences(ISymbol symbol, Compilation compilation)
{
CompilationData compilationData;
return s_compilationDataCache.TryGetValue(compilation, out compilationData) &&
compilationData.RemoveCachedDeclaringReferences(symbol);
}
} }
} }
\ No newline at end of file
...@@ -1397,24 +1397,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ...@@ -1397,24 +1397,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Public NotOverridable Overrides ReadOnly Property DeclaringSyntaxReferences As ImmutableArray(Of SyntaxReference) Public NotOverridable Overrides ReadOnly Property DeclaringSyntaxReferences As ImmutableArray(Of SyntaxReference)
Get Get
' PERF: Declaring references are cached for compilations with event queue. Return GetDeclaringSyntaxReferenceHelper(SyntaxReferences)
Return If(Me.DeclaringCompilation?.EventQueue IsNot Nothing, GetCachedDeclaringReferences(), ComputeDeclaringReferencesCore())
End Get End Get
End Property End Property
Private Function GetCachedDeclaringReferences() As ImmutableArray(Of SyntaxReference)
Dim declaringReferences As ImmutableArray(Of SyntaxReference) = Nothing
If Not Diagnostics.AnalyzerDriver.TryGetCachedDeclaringReferences(Me, DeclaringCompilation, declaringReferences) Then
declaringReferences = ComputeDeclaringReferencesCore()
Diagnostics.AnalyzerDriver.CacheDeclaringReferences(Me, DeclaringCompilation, declaringReferences)
End If
Return declaringReferences
End Function
Private Function ComputeDeclaringReferencesCore() As ImmutableArray(Of SyntaxReference)
Return GetDeclaringSyntaxReferenceHelper(SyntaxReferences)
End Function
#End Region #End Region
#Region "Member from Syntax" #Region "Member from Syntax"
......
...@@ -391,21 +391,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols ...@@ -391,21 +391,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Public Overrides ReadOnly Property DeclaringSyntaxReferences As ImmutableArray(Of SyntaxReference) Public Overrides ReadOnly Property DeclaringSyntaxReferences As ImmutableArray(Of SyntaxReference)
Get Get
' PERF: Declaring references are cached for compilations with event queue. Return ComputeDeclaringReferencesCore()
Return If(Me.DeclaringCompilation?.EventQueue IsNot Nothing, GetCachedDeclaringReferences(), ComputeDeclaringReferencesCore())
End Get End Get
End Property End Property
Private Function GetCachedDeclaringReferences() As ImmutableArray(Of SyntaxReference)
Dim declaringReferences As ImmutableArray(Of SyntaxReference) = Nothing
If Not Diagnostics.AnalyzerDriver.TryGetCachedDeclaringReferences(Me, DeclaringCompilation, declaringReferences) Then
declaringReferences = ComputeDeclaringReferencesCore()
Diagnostics.AnalyzerDriver.CacheDeclaringReferences(Me, DeclaringCompilation, declaringReferences)
End If
Return declaringReferences
End Function
Private Function ComputeDeclaringReferencesCore() As ImmutableArray(Of SyntaxReference) Private Function ComputeDeclaringReferencesCore() As ImmutableArray(Of SyntaxReference)
Dim declarations As ImmutableArray(Of SingleNamespaceDeclaration) = _declaration.Declarations Dim declarations As ImmutableArray(Of SingleNamespaceDeclaration) = _declaration.Declarations
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册