From ba74756c14e501bdcca2187824639121962402d5 Mon Sep 17 00:00:00 2001 From: David Kean Date: Thu, 5 Oct 2017 19:31:18 +1100 Subject: [PATCH 1/2] Remove unnecessary List instantiation This was the cause of a large amount (1.2%) of allocations in a large project some of which end up on the large object heap. --- src/Build/Evaluation/Evaluator.cs | 6 +----- src/Build/Evaluation/LazyItemEvaluator.cs | 9 +++------ 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/Build/Evaluation/Evaluator.cs b/src/Build/Evaluation/Evaluator.cs index bfbfd8cbd6b..aec55d1ca89 100644 --- a/src/Build/Evaluation/Evaluator.cs +++ b/src/Build/Evaluation/Evaluator.cs @@ -837,12 +837,8 @@ private IDictionary Evaluate(ILoggingService loggingService, Bui if (lazyEvaluator != null) { // Tell the lazy evaluator to compute the items and add them to _data - IList.ItemData> items = lazyEvaluator.GetAllItems(); - // Don't box via IEnumerator and foreach; cache count so not to evaluate via interface each iteration - var itemsCount = items.Count; - for (var i = 0; i < itemsCount; i++) + foreach (var itemData in lazyEvaluator.GetAllItems()) { - var itemData = items[i]; if (itemData.ConditionResult) { _data.AddItem(itemData.Item); diff --git a/src/Build/Evaluation/LazyItemEvaluator.cs b/src/Build/Evaluation/LazyItemEvaluator.cs index 023ab758567..4e12184c4ab 100644 --- a/src/Build/Evaluation/LazyItemEvaluator.cs +++ b/src/Build/Evaluation/LazyItemEvaluator.cs @@ -401,13 +401,10 @@ private LazyItemList GetItemList(string itemType) return ret; } - public IList GetAllItems() + public IEnumerable GetAllItems() { - var ret = _itemLists.Values.SelectMany(itemList => itemList.GetItems(ImmutableHashSet.Empty)) - .OrderBy(itemData => itemData.ElementOrder) - .ToList(); - - return ret; + return _itemLists.Values.SelectMany(itemList => itemList.GetItems(ImmutableHashSet.Empty)) + .OrderBy(itemData => itemData.ElementOrder); } public void ProcessItemElement(string rootDirectory, ProjectItemElement itemElement, bool conditionResult) From 37a68e60ec53e8df9673fbf5b79a077628bc036e Mon Sep 17 00:00:00 2001 From: David Kean Date: Fri, 6 Oct 2017 09:19:00 +1100 Subject: [PATCH 2/2] Rename GetAllItems -> GetAllItemsDeferred Gives a better indication not to iterate multiple times. --- src/Build/Evaluation/Evaluator.cs | 2 +- src/Build/Evaluation/LazyItemEvaluator.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Build/Evaluation/Evaluator.cs b/src/Build/Evaluation/Evaluator.cs index aec55d1ca89..6c6a343e367 100644 --- a/src/Build/Evaluation/Evaluator.cs +++ b/src/Build/Evaluation/Evaluator.cs @@ -837,7 +837,7 @@ private IDictionary Evaluate(ILoggingService loggingService, Bui if (lazyEvaluator != null) { // Tell the lazy evaluator to compute the items and add them to _data - foreach (var itemData in lazyEvaluator.GetAllItems()) + foreach (var itemData in lazyEvaluator.GetAllItemsDeferred()) { if (itemData.ConditionResult) { diff --git a/src/Build/Evaluation/LazyItemEvaluator.cs b/src/Build/Evaluation/LazyItemEvaluator.cs index 4e12184c4ab..2e6541fec44 100644 --- a/src/Build/Evaluation/LazyItemEvaluator.cs +++ b/src/Build/Evaluation/LazyItemEvaluator.cs @@ -401,7 +401,7 @@ private LazyItemList GetItemList(string itemType) return ret; } - public IEnumerable GetAllItems() + public IEnumerable GetAllItemsDeferred() { return _itemLists.Values.SelectMany(itemList => itemList.GetItems(ImmutableHashSet.Empty)) .OrderBy(itemData => itemData.ElementOrder);