From 11629deea92bb0f0b341ba6eb2f04a5072fbdcd2 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Tue, 10 Jun 2014 22:23:06 -0700 Subject: [PATCH] perf(ChangeDetector): lazy initialize DuplicateMap This slightly reduces number of Maps in the system. --- .../dirty_checking_change_detector.dart | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/change_detection/dirty_checking_change_detector.dart b/lib/change_detection/dirty_checking_change_detector.dart index c8c02354e..eef538e26 100644 --- a/lib/change_detection/dirty_checking_change_detector.dart +++ b/lib/change_detection/dirty_checking_change_detector.dart @@ -872,10 +872,10 @@ class _CollectionChangeRecord implements CollectionChangeRecord { int _length; /// Keeps track of moved items. - DuplicateMap _movedItems = new DuplicateMap(); + DuplicateMap _movedItems; /// Keeps track of removed items. - DuplicateMap _removedItems = new DuplicateMap(); + DuplicateMap _removedItems; ItemRecord _previousItHead; ItemRecord _itHead, _itTail; @@ -886,7 +886,7 @@ class _CollectionChangeRecord implements CollectionChangeRecord { void _revertToPreviousState() { if (!isDirty) return; - _movedItems.clear(); + if (_movedItems != null) _movedItems.clear(); ItemRecord prev; int i = 0; @@ -896,6 +896,8 @@ class _CollectionChangeRecord implements CollectionChangeRecord { record.currentIndex = record.previousIndex = i; record._prev = prev; if (prev != null) prev._next = prev._nextPrevious = record; + + if (_movedItems == null) _movedItems = new DuplicateMap(); _movedItems.put(record); } @@ -1060,13 +1062,13 @@ class _CollectionChangeRecord implements CollectionChangeRecord { } // Attempt to see if we have seen the item before. - record = _movedItems.get(item, index); + record = _movedItems == null ? null : _movedItems.get(item, index); if (record != null) { // We have seen this before, we need to move it forward in the collection. _moveAfter(record, previousRecord, index); } else { // Never seen it, check evicted list. - record = _removedItems.get(item); + record = _removedItems == null ? null : _removedItems.get(item); if (record != null) { // It is an item which we have evicted earlier: reinsert it back into the list. _reinsertAfter(record, previousRecord, index); @@ -1105,7 +1107,7 @@ class _CollectionChangeRecord implements CollectionChangeRecord { * of 'b' rather then switch 'a' with 'b' and then add 'a' at the end. */ ItemRecord verifyReinsertion(ItemRecord record, item, int index) { - ItemRecord reinsertRecord = _removedItems.get(item); + ItemRecord reinsertRecord = _removedItems == null ? null : _removedItems.get(item); if (reinsertRecord != null) { record = _reinsertAfter(reinsertRecord, record._prev, index); } else if (record.currentIndex != index) { @@ -1127,7 +1129,7 @@ class _CollectionChangeRecord implements CollectionChangeRecord { _addToRemovals(_unlink(record)); record = nextRecord; } - _removedItems.clear(); + if (_removedItems != null) _removedItems.clear(); if (_additionsTail != null) _additionsTail._nextAdded = null; if (_movesTail != null) _movesTail._nextMoved = null; @@ -1136,7 +1138,7 @@ class _CollectionChangeRecord implements CollectionChangeRecord { } ItemRecord _reinsertAfter(ItemRecord record, ItemRecord prevRecord, int index) { - _removedItems.remove(record); + if (_removedItems != null) _removedItems.remove(record); var prev = record._prevRemoved; var next = record._nextRemoved; @@ -1198,6 +1200,8 @@ class _CollectionChangeRecord implements CollectionChangeRecord { prevRecord._next = record; } + if (_movedItems == null) _movedItems = new DuplicateMap(); + _movedItems.put(record); record.currentIndex = index; return record; @@ -1206,7 +1210,7 @@ class _CollectionChangeRecord implements CollectionChangeRecord { ItemRecord _remove(ItemRecord record) => _addToRemovals(_unlink(record)); ItemRecord _unlink(ItemRecord record) { - _movedItems.remove(record); + if (_movedItems != null) _movedItems.remove(record); var prev = record._prev; var next = record._next; @@ -1245,6 +1249,7 @@ class _CollectionChangeRecord implements CollectionChangeRecord { } ItemRecord _addToRemovals(ItemRecord record) { + if (_removedItems == null) _removedItems = new DuplicateMap(); _removedItems.put(record); record.currentIndex = null; record._nextRemoved = null;