Skip to content

Commit 5620a61

Browse files
committed
Reduce lambda allocations in ReadWriteMap
1 parent 2200c4b commit 5620a61

File tree

3 files changed

+67
-9
lines changed

3 files changed

+67
-9
lines changed

core/src/main/java/org/mini2Dx/miniscript/core/util/ReadWriteMap.java

+27-9
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,24 @@ protected Set<Entry<K, V>> initialValue() {
3030
return new HashSet<>();
3131
}
3232
};
33+
private final ThreadLocal<ToSetConsumer<K>> keyConsumer = new ThreadLocal<ToSetConsumer<K>>() {
34+
@Override
35+
protected ToSetConsumer<K> initialValue() {
36+
return new ToSetConsumer<K>();
37+
}
38+
};
39+
private final ThreadLocal<ToCollectionConsumer<V>> valueConsumer = new ThreadLocal<ToCollectionConsumer<V>>() {
40+
@Override
41+
protected ToCollectionConsumer<V> initialValue() {
42+
return new ToCollectionConsumer<V>();
43+
}
44+
};
45+
private final ThreadLocal<ToSetConsumer<Entry<K, V>>> entryConsumer = new ThreadLocal<ToSetConsumer<Entry<K, V>>>() {
46+
@Override
47+
protected ToSetConsumer<Entry<K, V>> initialValue() {
48+
return new ToSetConsumer<Entry<K, V>>();
49+
}
50+
};
3351

3452
@Override
3553
public int size() {
@@ -105,9 +123,9 @@ public Set<K> keySet() {
105123
try {
106124
result.clear();
107125
//addAll allocates arrays unnecessarily
108-
internalMap.keySet().forEach((key) -> {
109-
result.add(key);
110-
});
126+
final ToSetConsumer<K> consumer = keyConsumer.get();
127+
consumer.setSet(result);
128+
internalMap.keySet().forEach(consumer);
111129
} finally {
112130
lock.unlockRead();
113131
}
@@ -121,9 +139,9 @@ public Collection<V> values() {
121139
try {
122140
result.clear();
123141
//addAll allocates arrays unnecessarily
124-
internalMap.values().forEach((val) -> {
125-
result.add(val);
126-
});
142+
final ToCollectionConsumer<V> consumer = valueConsumer.get();
143+
consumer.setCollection(result);
144+
internalMap.values().forEach(consumer);
127145
} finally {
128146
lock.unlockRead();
129147
}
@@ -137,9 +155,9 @@ public Set<Entry<K, V>> entrySet() {
137155
try {
138156
result.clear();
139157
//addAll allocates arrays unnecessarily
140-
internalMap.entrySet().forEach((entry) -> {
141-
result.add(entry);
142-
});
158+
final ToSetConsumer<Entry<K, V>> consumer = entryConsumer.get();
159+
consumer.setSet(result);
160+
internalMap.entrySet().forEach(consumer);
143161
} finally {
144162
lock.unlockRead();
145163
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* Copyright 2021 Viridian Software Ltd.
3+
*/
4+
package org.mini2Dx.miniscript.core.util;
5+
6+
import java.util.Collection;
7+
import java.util.function.Consumer;
8+
9+
public class ToCollectionConsumer<T> implements Consumer<T> {
10+
private Collection<T> collection;
11+
12+
@Override
13+
public void accept(T t) {
14+
collection.add(t);
15+
}
16+
17+
public void setCollection(Collection<T> list) {
18+
this.collection = list;
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* Copyright 2021 Viridian Software Ltd.
3+
*/
4+
package org.mini2Dx.miniscript.core.util;
5+
6+
import java.util.Set;
7+
import java.util.function.Consumer;
8+
9+
public class ToSetConsumer<T> implements Consumer<T> {
10+
private Set<T> set;
11+
12+
@Override
13+
public void accept(T t) {
14+
set.add(t);
15+
}
16+
17+
public void setSet(Set<T> list) {
18+
this.set = list;
19+
}
20+
}

0 commit comments

Comments
 (0)