Skip to content

Commit 314c1e1

Browse files
committed
use values iterator
1 parent 6b19fb0 commit 314c1e1

File tree

2 files changed

+11
-7
lines changed

2 files changed

+11
-7
lines changed

pkgs/collection/CHANGELOG.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22

33
- Add `IterableMapEntryExtension` for working on `Map` as a list of pairs, using
44
`Map.entries`.
5-
- Use `entries` and `update` in map equality implementations.
6-
- Speeds up all equality checks.
7-
- Speeds up implementations for maps with slow lookup, at a slight cost for
8-
other implementations.
5+
- Optimize equality and hash code for maps by using `update` and a `values`
6+
iterator to avoid extra lookups.
97

108
## 1.19.1
119

pkgs/collection/lib/src/equality.dart

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,11 +325,15 @@ class MapEquality<K, V> implements Equality<Map<K, V>> {
325325
var length = map1.length;
326326
if (length != map2.length) return false;
327327
Map<_MapEntry, int> equalElementCounts = HashMap();
328-
for (var MapEntry(:key, :value) in map1.entries) {
328+
var values1 = map1.values.iterator;
329+
for (var key in map1.keys) {
330+
var value = (values1..moveNext()).current;
329331
var entry = _MapEntry(this, key, value);
330332
equalElementCounts.update(entry, (i) => i + 1, ifAbsent: () => 1);
331333
}
332-
for (var MapEntry(:key, :value) in map2.entries) {
334+
final values2 = map2.values.iterator;
335+
for (var key in map2.keys) {
336+
var value = (values2..moveNext()).current;
333337
var entry = _MapEntry(this, key, value);
334338
var count =
335339
equalElementCounts.update(entry, (i) => i - 1, ifAbsent: () => -1);
@@ -342,7 +346,9 @@ class MapEquality<K, V> implements Equality<Map<K, V>> {
342346
int hash(Map<K, V>? map) {
343347
if (map == null) return null.hashCode;
344348
var hash = 0;
345-
for (var MapEntry(:key, :value) in map.entries) {
349+
var values = map.values.iterator;
350+
for (var key in map.keys) {
351+
var value = (values..moveNext()).current;
346352
var keyHash = _keyEquality.hash(key);
347353
var valueHash = _valueEquality.hash(value);
348354
hash = (hash + 3 * keyHash + 7 * valueHash) & _hashMask;

0 commit comments

Comments
 (0)