Skip to content

Commit 901bf4f

Browse files
Cache StringBuilders per-measurement in ThreadLocal maps. Much faster and
generates > 800MB less garbage in the PerformanceTests.maxWritePointsPerformance() test compared to the master branch.
1 parent d27c4db commit 901bf4f

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

src/main/java/org/influxdb/dto/Point.java

+22-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.math.BigDecimal;
44
import java.math.BigInteger;
55
import java.text.NumberFormat;
6+
import java.util.HashMap;
67
import java.util.Locale;
78
import java.util.Map;
89
import java.util.Map.Entry;
@@ -48,6 +49,9 @@ public class Point {
4849
return numberFormat;
4950
});
5051

52+
private static final ThreadLocal<Map<String, MeasurementStringBuilder>> CACHED_STRINGBUILDERS =
53+
ThreadLocal.withInitial(HashMap::new);
54+
5155
Point() {
5256
}
5357

@@ -324,8 +328,10 @@ public String toString() {
324328
* @return the String without newLine.
325329
*/
326330
public String lineProtocol() {
327-
final StringBuilder sb = new StringBuilder(128);
328-
sb.append(KEY_ESCAPER.escape(this.measurement));
331+
final StringBuilder sb = CACHED_STRINGBUILDERS
332+
.get()
333+
.computeIfAbsent(this.measurement, MeasurementStringBuilder::new)
334+
.resetForUse();
329335

330336
concatenatedTags(sb);
331337
concatenatedFields(sb);
@@ -379,4 +385,18 @@ private void formatedTime(final StringBuilder sb) {
379385
sb.append(' ').append(TimeUnit.NANOSECONDS.convert(this.time, this.precision));
380386
}
381387

388+
private static class MeasurementStringBuilder {
389+
private final StringBuilder sb = new StringBuilder(128);
390+
private final int length;
391+
392+
MeasurementStringBuilder(final String measurement) {
393+
this.sb.append(KEY_ESCAPER.escape(measurement));
394+
this.length = sb.length();
395+
}
396+
397+
StringBuilder resetForUse() {
398+
sb.setLength(length);
399+
return sb;
400+
}
401+
}
382402
}

0 commit comments

Comments
 (0)