Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Ungureanu <therzok@gmail.com>2018-03-26 20:22:08 +0300
committerMarius Ungureanu <teromario@yahoo.com>2018-04-17 14:13:26 +0300
commitc69f43395b832952a6299e86755e29d6a2e0e722 (patch)
tree0e2e14129d6aef019e24c790940873868668de8e /main/src/core
parent863bb04df92a85cd91df09b91324ff6ad4a64b91 (diff)
[ProjectModel] Optimize allocations on evaluation
Avoid enumerator boxing and avoid allocating a string for all the property imports
Diffstat (limited to 'main/src/core')
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ImportSearchPathExtensionNode.cs9
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/DefaultMSBuildEngine.cs28
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildEvaluationContext.cs2
3 files changed, 30 insertions, 9 deletions
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ImportSearchPathExtensionNode.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ImportSearchPathExtensionNode.cs
index 7835f1cc35..bb3875187d 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ImportSearchPathExtensionNode.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Extensions/ImportSearchPathExtensionNode.cs
@@ -36,6 +36,15 @@ namespace MonoDevelop.Projects.Extensions
[NodeAttribute ("property")]
public string Property { get; set; }
+ string msbuildProperty;
+ internal string MSBuildProperty {
+ get {
+ if (msbuildProperty == null)
+ msbuildProperty = "$(" + Property + ")";
+ return msbuildProperty;
+ }
+ }
+
string path;
public new string Path {
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/DefaultMSBuildEngine.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/DefaultMSBuildEngine.cs
index 90adb3c67b..031bd2492f 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/DefaultMSBuildEngine.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/DefaultMSBuildEngine.cs
@@ -1042,12 +1042,12 @@ namespace MonoDevelop.Projects.MSBuild
return CreateEvaluatedItem (context, project, project.Project, item, context.EvaluateString (item.Include));
}
- IEnumerable<ProjectInfo> GetImportedProjects (ProjectInfo project, MSBuildImport import)
+ IReadOnlyList<ProjectInfo> GetImportedProjects (ProjectInfo project, MSBuildImport import)
{
List<ProjectInfo> prefProjects;
if (project.ImportedProjects.TryGetValue (import, out prefProjects))
return prefProjects;
- return Enumerable.Empty<ProjectInfo> ();
+ return Array.Empty<ProjectInfo> ();
}
void AddImportedProject (ProjectInfo project, MSBuildImport import, ProjectInfo imported)
@@ -1068,10 +1068,12 @@ namespace MonoDevelop.Projects.MSBuild
void Evaluate (ProjectInfo project, MSBuildEvaluationContext context, MSBuildImport import, bool evalItems)
{
- if (evalItems) {
- // Properties have already been evaluated
- // Don't evaluate properties, only items and other elements
- foreach (var p in GetImportedProjects (project, import)) {
+ if (evalItems) {
+ // Properties have already been evaluated
+ // Don't evaluate properties, only items and other elements
+ var importedProjects = GetImportedProjects (project, import);
+ for (int i = 0; i < importedProjects.Count; ++i) {
+ var p = importedProjects [i];
EvaluateProject (p, new MSBuildEvaluationContext (context), true);
@@ -1115,9 +1117,19 @@ namespace MonoDevelop.Projects.MSBuild
// In that case, look in fallback search paths
if (keepSearching) {
- foreach (var prop in context.GetProjectImportSearchPaths ()) {
- if (import.Project.IndexOf ("$(" + prop.Property + ")", StringComparison.OrdinalIgnoreCase) == -1)
+ // Short-circuit if we don't have an import that is done via a property.
+ int propertyStart = import.Project.IndexOf ("$(", StringComparison.Ordinal);
+ if (propertyStart == -1)
+ return;
+
+ var importSearchPaths = context.GetProjectImportSearchPaths ();
+ for (int i = 0; i < importSearchPaths.Count; ++i) {
+ var prop = importSearchPaths [i];
+
+ // Start searching from where the property was found.
+ if (import.Project.IndexOf (prop.MSBuildProperty, propertyStart, StringComparison.OrdinalIgnoreCase) == -1)
continue;
+
files = GetImportFiles (project, context, import, prop.Property, prop.Path, out resolvedSdksPath, out keepSearching);
if (files != null) {
foreach (var f in files)
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildEvaluationContext.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildEvaluationContext.cs
index 7afbf74a5e..0f37e215f9 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildEvaluationContext.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildEvaluationContext.cs
@@ -227,7 +227,7 @@ namespace MonoDevelop.Projects.MSBuild
get { return project; }
}
- public IEnumerable<ImportSearchPathExtensionNode> GetProjectImportSearchPaths ()
+ public IReadOnlyList<ImportSearchPathExtensionNode> GetProjectImportSearchPaths ()
{
if (parentContext != null)
return parentContext.GetProjectImportSearchPaths ();