Skip to content

Commit 44c9e73

Browse files
greenrobotgreenrobot-team
authored andcommitted
prepare statically cached FlexBuffersBuilder
1 parent da27d2f commit 44c9e73

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

objectbox-java/src/main/java/io/objectbox/converter/StringMapConverter.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,26 @@
88
import java.util.HashMap;
99
import java.util.Map;
1010
import java.util.Map.Entry;
11+
import java.util.concurrent.atomic.AtomicReference;
1112

1213
/**
1314
* Converts a String map entity property to a byte array database value using FlexBuffers.
1415
*/
1516
public class StringMapConverter implements PropertyConverter<Map<String, String>, byte[]> {
17+
18+
private static final AtomicReference<FlexBuffersBuilder> cachedBuilder = new AtomicReference<>();
19+
1620
@Override
1721
public byte[] convertToDatabaseValue(Map<String, String> map) {
1822
if (map == null) return null;
1923

20-
FlexBuffersBuilder builder = new FlexBuffersBuilder(
21-
new ArrayReadWriteBuf(512),
22-
FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS
23-
);
24+
FlexBuffersBuilder builder = cachedBuilder.getAndSet(null);
25+
if (builder == null) {
26+
builder = new FlexBuffersBuilder(
27+
new ArrayReadWriteBuf(512),
28+
FlexBuffersBuilder.BUILDER_FLAG_SHARE_KEYS_AND_STRINGS
29+
);
30+
}
2431
int mapStart = builder.startMap();
2532

2633
for (Entry<String, String> entry : map.entrySet()) {
@@ -35,6 +42,13 @@ public byte[] convertToDatabaseValue(Map<String, String> map) {
3542

3643
byte[] out = new byte[buffer.limit()];
3744
buffer.get(out);
45+
46+
// Cache if builder does not consume too much memory
47+
if (buffer.limit() <= 256 * 1024) {
48+
builder.clear();
49+
cachedBuilder.getAndSet(builder);
50+
}
51+
3852
return out;
3953
}
4054

0 commit comments

Comments
 (0)