Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1013)

Unified Diff: runtime/lib/compact_hash.dart

Issue 1834093002: VM: Fix _CompactLinkedHashSet performance regression. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/lib/compact_hash.dart
diff --git a/runtime/lib/compact_hash.dart b/runtime/lib/compact_hash.dart
index d973a740c393b7438e15aec974b24e7148fda6e2..1c2de88081c8f4ef72b8a69952119ad719d6a519 100644
--- a/runtime/lib/compact_hash.dart
+++ b/runtime/lib/compact_hash.dart
@@ -16,10 +16,10 @@ abstract class _HashFieldBase {
// NOTE: When maps are deserialized, their _index and _hashMask is regenerated
// lazily by _regenerateIndex.
// TODO(koda): Consider also using null _index for tiny, linear-search tables.
- Uint32List _index;
+ Uint32List _index = new Uint32List(_HashBase._INITIAL_INDEX_SIZE);
// Cached in-place mask for the hash pattern component.
- int _hashMask;
+ int _hashMask = _HashBase._indexSizeToHashMask(_HashBase._INITIAL_INDEX_SIZE);
// Fixed-length list of keys (set) or key/value at even/odd indices (map).
List _data;
@@ -29,6 +29,11 @@ abstract class _HashFieldBase {
// Number of deleted keys.
int _deletedKeys = 0;
+
+ // Note: All fields are initialized in a single constructor so that the VM
+ // recognizes they cannot hold null values. This makes a big (20%) performance
+ // difference on some operations.
+ _HashFieldBase(int dataSize) : this._data = new List(dataSize);
}
// Base class for VM-internal classes; keep in sync with _HashFieldBase.
@@ -352,11 +357,7 @@ class _CompactLinkedIdentityHashMap<K, V> extends _HashFieldBase
_IdenticalAndIdentityHashCode
implements LinkedHashMap<K, V> {
- _CompactLinkedIdentityHashMap() {
- _index = new Uint32List(_HashBase._INITIAL_INDEX_SIZE);
- _hashMask = _HashBase._indexSizeToHashMask(_HashBase._INITIAL_INDEX_SIZE);
- _data = new List(_HashBase._INITIAL_INDEX_SIZE);
- }
+ _CompactLinkedIdentityHashMap() : super(_HashBase._INITIAL_INDEX_SIZE);
}
class _CompactLinkedCustomHashMap<K, V> extends _HashFieldBase
@@ -375,11 +376,8 @@ class _CompactLinkedCustomHashMap<K, V> extends _HashFieldBase
V remove(Object o) => _validKey(o) ? super.remove(o) : null;
_CompactLinkedCustomHashMap(this._equality, this._hasher, validKey)
- : _validKey = (validKey != null) ? validKey : new _TypeTest<K>().test {
- _index = new Uint32List(_HashBase._INITIAL_INDEX_SIZE);
- _hashMask = _HashBase._indexSizeToHashMask(_HashBase._INITIAL_INDEX_SIZE);
- _data = new List(_HashBase._INITIAL_INDEX_SIZE);
- }
+ : _validKey = (validKey != null) ? validKey : new _TypeTest<K>().test,
+ super(_HashBase._INITIAL_INDEX_SIZE);
}
// Iterates through _data[_offset + _step], _data[_offset + 2*_step], ...
@@ -436,11 +434,8 @@ class _CompactLinkedHashSet<E> extends _HashFieldBase
with _HashBase, _OperatorEqualsAndHashCode, SetMixin<E>
implements LinkedHashSet<E> {
- _CompactLinkedHashSet() {
+ _CompactLinkedHashSet() : super(_HashBase._INITIAL_INDEX_SIZE >> 1) {
assert(_HashBase._UNUSED_PAIR == 0);
- _index = new Uint32List(_HashBase._INITIAL_INDEX_SIZE);
- _hashMask = _HashBase._indexSizeToHashMask(_HashBase._INITIAL_INDEX_SIZE);
- _data = new List(_HashBase._INITIAL_INDEX_SIZE >> 1);
}
int get length => _usedData - _deletedKeys;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698