Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
0fd3e1cb
R
roslyn
项目概览
lwm1986
/
roslyn
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roslyn
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
0fd3e1cb
编写于
10月 03, 2017
作者:
J
Jason Malinowski
提交者:
GitHub
10月 03, 2017
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #22494 from jasonmalinowski/reduce-documentid-array-allocations
Reduce DocumentId array allocations
上级
ab01f7a8
9ee89371
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
74 addition
and
51 deletion
+74
-51
src/Workspaces/Core/Portable/Workspace/Solution/ProjectState.cs
...rkspaces/Core/Portable/Workspace/Solution/ProjectState.cs
+65
-40
src/Workspaces/Core/Portable/Workspace/Solution/ProjectState_Checksum.cs
...Core/Portable/Workspace/Solution/ProjectState_Checksum.cs
+4
-6
src/Workspaces/Core/Portable/Workspace/Solution/StateChecksums.cs
...spaces/Core/Portable/Workspace/Solution/StateChecksums.cs
+1
-1
src/Workspaces/Remote/Core/Services/SolutionCreator.cs
src/Workspaces/Remote/Core/Services/SolutionCreator.cs
+4
-4
未找到文件。
src/Workspaces/Core/Portable/Workspace/Solution/ProjectState.cs
浏览文件 @
0fd3e1cb
...
...
@@ -20,10 +20,21 @@ internal partial class ProjectState
private
readonly
ProjectInfo
_projectInfo
;
private
readonly
HostLanguageServices
_languageServices
;
private
readonly
SolutionServices
_solutionServices
;
private
readonly
ImmutableDictionary
<
DocumentId
,
DocumentState
>
_documentStates
;
private
readonly
ImmutableDictionary
<
DocumentId
,
TextDocumentState
>
_additionalDocumentStates
;
private
readonly
IReadOnlyList
<
DocumentId
>
_documentIds
;
private
readonly
IReadOnlyList
<
DocumentId
>
_additionalDocumentIds
;
/// <summary>
/// The documents in this project. They are sorted by <see cref="DocumentId.Id"/> to provide a stable sort for
/// <see cref="GetChecksumAsync(CancellationToken)"/>.
/// </summary>
private
readonly
ImmutableSortedDictionary
<
DocumentId
,
DocumentState
>
_documentStates
;
/// <summary>
/// The additional documents in this project. They are sorted by <see cref="DocumentId.Id"/> to provide a stable sort for
/// <see cref="GetChecksumAsync(CancellationToken)"/>.
/// </summary>
private
readonly
ImmutableSortedDictionary
<
DocumentId
,
TextDocumentState
>
_additionalDocumentStates
;
private
readonly
ImmutableList
<
DocumentId
>
_documentIds
;
private
readonly
ImmutableList
<
DocumentId
>
_additionalDocumentIds
;
private
readonly
AsyncLazy
<
VersionStamp
>
_lazyLatestDocumentVersion
;
private
readonly
AsyncLazy
<
VersionStamp
>
_lazyLatestDocumentTopLevelChangeVersion
;
...
...
@@ -37,17 +48,17 @@ internal partial class ProjectState
ProjectInfo
projectInfo
,
HostLanguageServices
languageServices
,
SolutionServices
solutionServices
,
I
Enumerable
<
DocumentId
>
documentIds
,
I
Enumerable
<
DocumentId
>
additionalDocumentIds
,
ImmutableDictionary
<
DocumentId
,
DocumentState
>
documentStates
,
ImmutableDictionary
<
DocumentId
,
TextDocumentState
>
additionalDocumentStates
,
I
mmutableList
<
DocumentId
>
documentIds
,
I
mmutableList
<
DocumentId
>
additionalDocumentIds
,
Immutable
Sorted
Dictionary
<
DocumentId
,
DocumentState
>
documentStates
,
Immutable
Sorted
Dictionary
<
DocumentId
,
TextDocumentState
>
additionalDocumentStates
,
AsyncLazy
<
VersionStamp
>
lazyLatestDocumentVersion
,
AsyncLazy
<
VersionStamp
>
lazyLatestDocumentTopLevelChangeVersion
)
{
_solutionServices
=
solutionServices
;
_languageServices
=
languageServices
;
_documentIds
=
documentIds
.
ToImmutableReadOnlyListOrEmpty
()
;
_additionalDocumentIds
=
additionalDocumentIds
.
ToImmutableReadOnlyListOrEmpty
()
;
_documentIds
=
documentIds
;
_additionalDocumentIds
=
additionalDocumentIds
;
_documentStates
=
documentStates
;
_additionalDocumentStates
=
additionalDocumentStates
;
_lazyLatestDocumentVersion
=
lazyLatestDocumentVersion
;
...
...
@@ -72,18 +83,18 @@ public ProjectState(ProjectInfo projectInfo, HostLanguageServices languageServic
var
projectInfoFixed
=
FixProjectInfo
(
projectInfo
);
_documentIds
=
projectInfoFixed
.
Documents
.
Select
(
d
=>
d
.
Id
).
ToImmutable
Array
();
_additionalDocumentIds
=
projectInfoFixed
.
AdditionalDocuments
.
Select
(
d
=>
d
.
Id
).
ToImmutable
Array
();
_documentIds
=
projectInfoFixed
.
Documents
.
Select
(
d
=>
d
.
Id
).
ToImmutable
List
();
_additionalDocumentIds
=
projectInfoFixed
.
AdditionalDocuments
.
Select
(
d
=>
d
.
Id
).
ToImmutable
List
();
var
parseOptions
=
projectInfoFixed
.
ParseOptions
;
var
docStates
=
Immutable
Dictionary
.
CreateRange
<
DocumentId
,
DocumentState
>(
var
docStates
=
Immutable
SortedDictionary
.
CreateRange
(
DocumentIdComparer
.
Instance
,
projectInfoFixed
.
Documents
.
Select
(
d
=>
new
KeyValuePair
<
DocumentId
,
DocumentState
>(
d
.
Id
,
CreateDocument
(
d
,
parseOptions
,
languageServices
,
solutionServices
))));
_documentStates
=
docStates
;
var
additionalDocStates
=
Immutable
Dictionary
.
CreateRange
<
DocumentId
,
TextDocumentState
>(
var
additionalDocStates
=
Immutable
SortedDictionary
.
CreateRange
(
DocumentIdComparer
.
Instance
,
projectInfoFixed
.
AdditionalDocuments
.
Select
(
d
=>
new
KeyValuePair
<
DocumentId
,
TextDocumentState
>(
d
.
Id
,
TextDocumentState
.
Create
(
d
,
solutionServices
))));
...
...
@@ -129,7 +140,7 @@ private ProjectInfo FixProjectInfo(ProjectInfo projectInfo)
return
projectInfo
;
}
private
static
async
Task
<
VersionStamp
>
ComputeLatestDocumentVersionAsync
(
I
mmutableDictionary
<
DocumentId
,
DocumentState
>
documentStates
,
ImmutableDictionary
<
DocumentId
,
TextDocumentState
>
additionalDocumentStates
,
CancellationToken
cancellationToken
)
private
static
async
Task
<
VersionStamp
>
ComputeLatestDocumentVersionAsync
(
I
ImmutableDictionary
<
DocumentId
,
DocumentState
>
documentStates
,
I
ImmutableDictionary
<
DocumentId
,
TextDocumentState
>
additionalDocumentStates
,
CancellationToken
cancellationToken
)
{
// this may produce a version that is out of sync with the actual Document versions.
var
latestVersion
=
VersionStamp
.
Default
;
...
...
@@ -157,8 +168,8 @@ private static async Task<VersionStamp> ComputeLatestDocumentVersionAsync(Immuta
private
AsyncLazy
<
VersionStamp
>
CreateLazyLatestDocumentTopLevelChangeVersion
(
TextDocumentState
newDocument
,
ImmutableDictionary
<
DocumentId
,
DocumentState
>
newDocumentStates
,
ImmutableDictionary
<
DocumentId
,
TextDocumentState
>
newAdditionalDocumentStates
)
I
I
mmutableDictionary
<
DocumentId
,
DocumentState
>
newDocumentStates
,
I
I
mmutableDictionary
<
DocumentId
,
TextDocumentState
>
newAdditionalDocumentStates
)
{
if
(
_lazyLatestDocumentTopLevelChangeVersion
.
TryGetValue
(
out
var
oldVersion
))
{
...
...
@@ -176,7 +187,7 @@ private static async Task<VersionStamp> ComputeTopLevelChangeTextVersionAsync(Ve
return
newVersion
.
GetNewerVersion
(
oldVersion
);
}
private
static
async
Task
<
VersionStamp
>
ComputeLatestDocumentTopLevelChangeVersionAsync
(
I
mmutableDictionary
<
DocumentId
,
DocumentState
>
documentStates
,
ImmutableDictionary
<
DocumentId
,
TextDocumentState
>
additionalDocumentStates
,
CancellationToken
cancellationToken
)
private
static
async
Task
<
VersionStamp
>
ComputeLatestDocumentTopLevelChangeVersionAsync
(
I
ImmutableDictionary
<
DocumentId
,
DocumentState
>
documentStates
,
I
ImmutableDictionary
<
DocumentId
,
TextDocumentState
>
additionalDocumentStates
,
CancellationToken
cancellationToken
)
{
// this may produce a version that is out of sync with the actual Document versions.
var
latestVersion
=
VersionStamp
.
Default
;
...
...
@@ -312,10 +323,10 @@ public async Task<VersionStamp> GetSemanticVersionAsync(CancellationToken cancel
public
IReadOnlyList
<
DocumentId
>
AdditionalDocumentIds
=>
_additionalDocumentIds
;
[
DebuggerBrowsable
(
DebuggerBrowsableState
.
Collapsed
)]
public
ImmutableDictionary
<
DocumentId
,
DocumentState
>
DocumentStates
=>
_documentStates
;
public
I
I
mmutableDictionary
<
DocumentId
,
DocumentState
>
DocumentStates
=>
_documentStates
;
[
DebuggerBrowsable
(
DebuggerBrowsableState
.
Collapsed
)]
public
ImmutableDictionary
<
DocumentId
,
TextDocumentState
>
AdditionalDocumentStates
=>
_additionalDocumentStates
;
public
I
I
mmutableDictionary
<
DocumentId
,
TextDocumentState
>
AdditionalDocumentStates
=>
_additionalDocumentStates
;
public
bool
ContainsDocument
(
DocumentId
documentId
)
{
...
...
@@ -341,10 +352,10 @@ public TextDocumentState GetAdditionalDocumentState(DocumentId documentId)
private
ProjectState
With
(
ProjectInfo
projectInfo
=
null
,
Immutable
Array
<
DocumentId
>
documentIds
=
default
,
Immutable
Array
<
DocumentId
>
additionalDocumentIds
=
default
,
ImmutableDictionary
<
DocumentId
,
DocumentState
>
documentStates
=
null
,
ImmutableDictionary
<
DocumentId
,
TextDocumentState
>
additionalDocumentStates
=
null
,
Immutable
List
<
DocumentId
>
documentIds
=
default
,
Immutable
List
<
DocumentId
>
additionalDocumentIds
=
default
,
Immutable
Sorted
Dictionary
<
DocumentId
,
DocumentState
>
documentStates
=
null
,
Immutable
Sorted
Dictionary
<
DocumentId
,
TextDocumentState
>
additionalDocumentStates
=
null
,
AsyncLazy
<
VersionStamp
>
latestDocumentVersion
=
null
,
AsyncLazy
<
VersionStamp
>
latestDocumentTopLevelChangeVersion
=
null
)
{
...
...
@@ -352,8 +363,8 @@ public TextDocumentState GetAdditionalDocumentState(DocumentId documentId)
projectInfo
??
_projectInfo
,
_languageServices
,
_solutionServices
,
documentIds
.
IsDefault
?
_documentIds
:
documentIds
,
additionalDocumentIds
.
IsDefault
?
_additionalDocumentIds
:
additionalDocumentIds
,
documentIds
??
_
documentIds
,
additionalDocumentIds
??
_
additionalDocumentIds
,
documentStates
??
_documentStates
,
additionalDocumentStates
??
_additionalDocumentStates
,
latestDocumentVersion
??
_lazyLatestDocumentVersion
,
...
...
@@ -558,8 +569,8 @@ public ProjectState AddDocument(DocumentState document)
return
this
.
With
(
projectInfo
:
this
.
ProjectInfo
.
WithVersion
(
this
.
Version
.
GetNewerVersion
()),
documentIds
:
this
.
DocumentIds
.
ToImmutableArray
()
.
Add
(
document
.
Id
),
documentStates
:
this
.
D
ocumentStates
.
Add
(
document
.
Id
,
document
));
documentIds
:
_documentIds
.
Add
(
document
.
Id
),
documentStates
:
_d
ocumentStates
.
Add
(
document
.
Id
,
document
));
}
public
ProjectState
AddAdditionalDocument
(
TextDocumentState
document
)
...
...
@@ -568,8 +579,8 @@ public ProjectState AddAdditionalDocument(TextDocumentState document)
return
this
.
With
(
projectInfo
:
this
.
ProjectInfo
.
WithVersion
(
this
.
Version
.
GetNewerVersion
()),
additionalDocumentIds
:
this
.
AdditionalDocumentIds
.
ToImmutableArray
()
.
Add
(
document
.
Id
),
additionalDocumentStates
:
this
.
A
dditionalDocumentStates
.
Add
(
document
.
Id
,
document
));
additionalDocumentIds
:
_additionalDocumentIds
.
Add
(
document
.
Id
),
additionalDocumentStates
:
_a
dditionalDocumentStates
.
Add
(
document
.
Id
,
document
));
}
public
ProjectState
RemoveDocument
(
DocumentId
documentId
)
...
...
@@ -578,8 +589,8 @@ public ProjectState RemoveDocument(DocumentId documentId)
return
this
.
With
(
projectInfo
:
this
.
ProjectInfo
.
WithVersion
(
this
.
Version
.
GetNewerVersion
()),
documentIds
:
this
.
DocumentIds
.
ToImmutableArray
()
.
Remove
(
documentId
),
documentStates
:
this
.
D
ocumentStates
.
Remove
(
documentId
));
documentIds
:
_documentIds
.
Remove
(
documentId
),
documentStates
:
_d
ocumentStates
.
Remove
(
documentId
));
}
public
ProjectState
RemoveAdditionalDocument
(
DocumentId
documentId
)
...
...
@@ -588,16 +599,16 @@ public ProjectState RemoveAdditionalDocument(DocumentId documentId)
return
this
.
With
(
projectInfo
:
this
.
ProjectInfo
.
WithVersion
(
this
.
Version
.
GetNewerVersion
()),
additionalDocumentIds
:
this
.
AdditionalDocumentIds
.
ToImmutableArray
()
.
Remove
(
documentId
),
additionalDocumentStates
:
this
.
A
dditionalDocumentStates
.
Remove
(
documentId
));
additionalDocumentIds
:
_additionalDocumentIds
.
Remove
(
documentId
),
additionalDocumentStates
:
_a
dditionalDocumentStates
.
Remove
(
documentId
));
}
public
ProjectState
RemoveAllDocuments
()
{
return
this
.
With
(
projectInfo
:
this
.
ProjectInfo
.
WithVersion
(
this
.
Version
.
GetNewerVersion
()).
WithDocuments
(
SpecializedCollections
.
EmptyEnumerable
<
DocumentInfo
>()),
documentIds
:
Immutable
Array
.
Create
<
DocumentId
>()
,
documentStates
:
Immutable
Dictionary
<
DocumentId
,
DocumentState
>.
Empty
);
documentIds
:
Immutable
List
<
DocumentId
>.
Empty
,
documentStates
:
Immutable
SortedDictionary
.
Create
<
DocumentId
,
DocumentState
>(
DocumentIdComparer
.
Instance
)
);
}
public
ProjectState
UpdateDocument
(
DocumentState
newDocument
,
bool
textChanged
,
bool
recalculateDependentVersions
)
...
...
@@ -610,7 +621,7 @@ public ProjectState UpdateDocument(DocumentState newDocument, bool textChanged,
return
this
;
}
var
newDocumentStates
=
this
.
D
ocumentStates
.
SetItem
(
newDocument
.
Id
,
newDocument
);
var
newDocumentStates
=
_d
ocumentStates
.
SetItem
(
newDocument
.
Id
,
newDocument
);
GetLatestDependentVersions
(
newDocumentStates
,
_additionalDocumentStates
,
oldDocument
,
newDocument
,
recalculateDependentVersions
,
textChanged
,
out
var
dependentDocumentVersion
,
out
var
dependentSemanticVersion
);
...
...
@@ -631,7 +642,7 @@ public ProjectState UpdateAdditionalDocument(TextDocumentState newDocument, bool
return
this
;
}
var
newDocumentStates
=
this
.
A
dditionalDocumentStates
.
SetItem
(
newDocument
.
Id
,
newDocument
);
var
newDocumentStates
=
_a
dditionalDocumentStates
.
SetItem
(
newDocument
.
Id
,
newDocument
);
GetLatestDependentVersions
(
_documentStates
,
newDocumentStates
,
oldDocument
,
newDocument
,
recalculateDependentVersions
,
textChanged
,
out
var
dependentDocumentVersion
,
out
var
dependentSemanticVersion
);
...
...
@@ -643,8 +654,8 @@ public ProjectState UpdateAdditionalDocument(TextDocumentState newDocument, bool
}
private
void
GetLatestDependentVersions
(
ImmutableDictionary
<
DocumentId
,
DocumentState
>
newDocumentStates
,
ImmutableDictionary
<
DocumentId
,
TextDocumentState
>
newAdditionalDocumentStates
,
I
I
mmutableDictionary
<
DocumentId
,
DocumentState
>
newDocumentStates
,
I
I
mmutableDictionary
<
DocumentId
,
TextDocumentState
>
newAdditionalDocumentStates
,
TextDocumentState
oldDocument
,
TextDocumentState
newDocument
,
bool
recalculateDependentVersions
,
bool
textChanged
,
out
AsyncLazy
<
VersionStamp
>
dependentDocumentVersion
,
out
AsyncLazy
<
VersionStamp
>
dependentSemanticVersion
)
...
...
@@ -680,5 +691,19 @@ public ProjectState UpdateAdditionalDocument(TextDocumentState newDocument, bool
CreateLazyLatestDocumentTopLevelChangeVersion
(
newDocument
,
newDocumentStates
,
newAdditionalDocumentStates
)
:
_lazyLatestDocumentTopLevelChangeVersion
;
}
private
sealed
class
DocumentIdComparer
:
IComparer
<
DocumentId
>
{
public
static
IComparer
<
DocumentId
>
Instance
=
new
DocumentIdComparer
();
private
DocumentIdComparer
()
{
}
public
int
Compare
(
DocumentId
x
,
DocumentId
y
)
{
return
x
.
Id
.
CompareTo
(
y
.
Id
);
}
}
}
}
src/Workspaces/Core/Portable/Workspace/Solution/ProjectState_Checksum.cs
浏览文件 @
0fd3e1cb
...
...
@@ -31,12 +31,10 @@ private async Task<ProjectStateChecksums> ComputeChecksumsAsync(CancellationToke
{
using
(
Logger
.
LogBlock
(
FunctionId
.
ProjectState_ComputeChecksumsAsync
,
FilePath
,
cancellationToken
))
{
// get states by id order to have deterministic checksum
var
orderedDocumentIds
=
ChecksumCache
.
GetOrCreate
(
DocumentIds
,
_
=>
DocumentIds
.
OrderBy
(
id
=>
id
.
Id
).
ToImmutableArray
());
var
documentChecksumsTasks
=
orderedDocumentIds
.
Select
(
id
=>
DocumentStates
[
id
].
GetChecksumAsync
(
cancellationToken
));
var
orderedAdditionalDocumentIds
=
ChecksumCache
.
GetOrCreate
(
AdditionalDocumentIds
,
_
=>
AdditionalDocumentIds
.
OrderBy
(
id
=>
id
.
Id
).
ToImmutableArray
());
var
additionalDocumentChecksumTasks
=
orderedAdditionalDocumentIds
.
Select
(
id
=>
AdditionalDocumentStates
[
id
].
GetChecksumAsync
(
cancellationToken
));
// Here, we use the _documentStates and _additionalDocumentStates and visit them in order; we ensure that those are
// sorted by ID so we have a consistent sort.
var
documentChecksumsTasks
=
_documentStates
.
Select
(
pair
=>
pair
.
Value
.
GetChecksumAsync
(
cancellationToken
));
var
additionalDocumentChecksumTasks
=
_additionalDocumentStates
.
Select
(
pair
=>
pair
.
Value
.
GetChecksumAsync
(
cancellationToken
));
var
serializer
=
new
Serializer
(
_solutionServices
.
Workspace
);
...
...
src/Workspaces/Core/Portable/Workspace/Solution/StateChecksums.cs
浏览文件 @
0fd3e1cb
...
...
@@ -174,7 +174,7 @@ public ProjectStateChecksums(params object[] children) : base(WellKnownSynchroni
}
private
static
void
Find
<
T
>(
ImmutableDictionary
<
DocumentId
,
T
>
values
,
I
I
mmutableDictionary
<
DocumentId
,
T
>
values
,
HashSet
<
Checksum
>
searchingChecksumsLeft
,
Dictionary
<
Checksum
,
object
>
result
,
CancellationToken
cancellationToken
)
where
T
:
TextDocumentState
...
...
src/Workspaces/Remote/Core/Services/SolutionCreator.cs
浏览文件 @
0fd3e1cb
...
...
@@ -413,17 +413,17 @@ private async Task<TextDocument> UpdateDocumentInfoAsync(TextDocument document,
return
GetDocumentMapAsync
(
project
,
project
.
State
.
DocumentStates
,
documents
);
}
private
async
Task
<
Dictionary
<
DocumentId
,
DocumentStateChecksums
>>
GetDocumentMapAsync
<
T
>(
Project
project
,
ImmutableDictionary
<
DocumentId
,
T
>
states
,
HashSet
<
Checksum
>
documents
)
private
async
Task
<
Dictionary
<
DocumentId
,
DocumentStateChecksums
>>
GetDocumentMapAsync
<
T
>(
Project
project
,
I
I
mmutableDictionary
<
DocumentId
,
T
>
states
,
HashSet
<
Checksum
>
documents
)
where
T
:
TextDocumentState
{
var
map
=
new
Dictionary
<
DocumentId
,
DocumentStateChecksums
>();
foreach
(
var
kv
in
states
)
{
var
do
uc
mentChecksums
=
await
kv
.
Value
.
GetStateChecksumsAsync
(
_cancellationToken
).
ConfigureAwait
(
false
);
if
(
documents
.
Contains
(
do
uc
mentChecksums
.
Checksum
))
var
do
cu
mentChecksums
=
await
kv
.
Value
.
GetStateChecksumsAsync
(
_cancellationToken
).
ConfigureAwait
(
false
);
if
(
documents
.
Contains
(
do
cu
mentChecksums
.
Checksum
))
{
map
.
Add
(
kv
.
Key
,
do
uc
mentChecksums
);
map
.
Add
(
kv
.
Key
,
do
cu
mentChecksums
);
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录