Skip to content

Commit

Permalink
Simple but significant performance improvements.
Browse files Browse the repository at this point in the history
  • Loading branch information
brettwooldridge committed Jun 1, 2017
1 parent df18f64 commit d27c4db
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 56 deletions.
84 changes: 39 additions & 45 deletions src/main/java/org/influxdb/dto/Point.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,16 @@ public class Point {
.addEscape(',', "\\,")
.addEscape('=', "\\=")
.build();

private static final int MAX_FRACTION_DIGITS = 340;
private static final ThreadLocal<NumberFormat> NUMBER_FORMATTER =
ThreadLocal.withInitial(() -> {
NumberFormat numberFormat = NumberFormat.getInstance(Locale.ENGLISH);
numberFormat.setMaximumFractionDigits(MAX_FRACTION_DIGITS);
numberFormat.setGroupingUsed(false);
numberFormat.setMinimumFractionDigits(1);
return numberFormat;
});

Point() {
}
Expand Down Expand Up @@ -121,20 +130,15 @@ public Builder field(final String field, Object value) {
if (value instanceof Number) {
if (value instanceof Byte) {
value = ((Byte) value).doubleValue();
}
if (value instanceof Short) {
} else if (value instanceof Short) {
value = ((Short) value).doubleValue();
}
if (value instanceof Integer) {
} else if (value instanceof Integer) {
value = ((Integer) value).doubleValue();
}
if (value instanceof Long) {
} else if (value instanceof Long) {
value = ((Long) value).doubleValue();
}
if (value instanceof BigInteger) {
} else if (value instanceof BigInteger) {
value = ((BigInteger) value).doubleValue();
}

}
fields.put(field, value);
return this;
Expand Down Expand Up @@ -320,69 +324,59 @@ public String toString() {
* @return the String without newLine.
*/
public String lineProtocol() {
final StringBuilder sb = new StringBuilder();
final StringBuilder sb = new StringBuilder(128);
sb.append(KEY_ESCAPER.escape(this.measurement));
sb.append(concatenatedTags());
sb.append(concatenateFields());
sb.append(formatedTime());

concatenatedTags(sb);
concatenatedFields(sb);
formatedTime(sb);

return sb.toString();
}

private StringBuilder concatenatedTags() {
final StringBuilder sb = new StringBuilder();
private void concatenatedTags(final StringBuilder sb) {
for (Entry<String, String> tag : this.tags.entrySet()) {
sb.append(",")
sb.append(',')
.append(KEY_ESCAPER.escape(tag.getKey()))
.append("=")
.append('=')
.append(KEY_ESCAPER.escape(tag.getValue()));
}
sb.append(" ");
return sb;
sb.append(' ');
}

private StringBuilder concatenateFields() {
final StringBuilder sb = new StringBuilder();
final int fieldCount = this.fields.size();
int loops = 0;

NumberFormat numberFormat = NumberFormat.getInstance(Locale.ENGLISH);
numberFormat.setMaximumFractionDigits(MAX_FRACTION_DIGITS);
numberFormat.setGroupingUsed(false);
numberFormat.setMinimumFractionDigits(1);

private void concatenatedFields(final StringBuilder sb) {
for (Entry<String, Object> field : this.fields.entrySet()) {
loops++;
Object value = field.getValue();
if (value == null) {
continue;
}

sb.append(KEY_ESCAPER.escape(field.getKey())).append("=");
if (value instanceof String) {
String stringValue = (String) value;
sb.append("\"").append(FIELD_ESCAPER.escape(stringValue)).append("\"");
} else if (value instanceof Number) {
sb.append(KEY_ESCAPER.escape(field.getKey())).append('=');
if (value instanceof Number) {
if (value instanceof Double || value instanceof Float || value instanceof BigDecimal) {
sb.append(numberFormat.format(value));
sb.append(NUMBER_FORMATTER.get().format(value));
} else {
sb.append(value).append("i");
sb.append(value).append('i');
}
} else if (value instanceof String) {
String stringValue = (String) value;
sb.append('"').append(FIELD_ESCAPER.escape(stringValue)).append('"');
} else {
sb.append(value);
}

if (loops < fieldCount) {
sb.append(",");
}
sb.append(',');
}

return sb;
// efficiently chop off the trailing comma
int lengthMinusOne = sb.length() - 1;
if (sb.charAt(lengthMinusOne) == ',') {
sb.setLength(lengthMinusOne);
}
}

private StringBuilder formatedTime() {
final StringBuilder sb = new StringBuilder();
sb.append(" ").append(TimeUnit.NANOSECONDS.convert(this.time, this.precision));
return sb;
private void formatedTime(final StringBuilder sb) {
sb.append(' ').append(TimeUnit.NANOSECONDS.convert(this.time, this.precision));
}

}
22 changes: 11 additions & 11 deletions src/main/java/org/influxdb/impl/InfluxDBImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

Expand All @@ -67,9 +67,9 @@ public class InfluxDBImpl implements InfluxDB {
private final InfluxDBService influxDBService;
private BatchProcessor batchProcessor;
private final AtomicBoolean batchEnabled = new AtomicBoolean(false);
private final AtomicLong writeCount = new AtomicLong();
private final AtomicLong unBatchedCount = new AtomicLong();
private final AtomicLong batchedCount = new AtomicLong();
private final LongAdder writeCount = new LongAdder();
private final LongAdder unBatchedCount = new LongAdder();
private final LongAdder batchedCount = new LongAdder();
private volatile DatagramSocket datagramSocket;
private final HttpLoggingInterceptor loggingInterceptor;
private final GzipRequestInterceptor gzipRequestInterceptor;
Expand Down Expand Up @@ -190,8 +190,8 @@ public void disableBatch() {
this.batchProcessor.flushAndShutdown();
if (this.logLevel != LogLevel.NONE) {
System.out.println(
"total writes:" + this.writeCount.get()
+ " unbatched:" + this.unBatchedCount.get()
"total writes:" + this.writeCount
+ " unbatched:" + this.unBatchedCount
+ " batchPoints:" + this.batchedCount);
}
}
Expand Down Expand Up @@ -240,9 +240,9 @@ public void write(final String database, final String retentionPolicy, final Poi
.retentionPolicy(retentionPolicy).build();
batchPoints.point(point);
this.write(batchPoints);
this.unBatchedCount.incrementAndGet();
this.unBatchedCount.increment();
}
this.writeCount.incrementAndGet();
this.writeCount.increment();
}

/**
Expand All @@ -255,14 +255,14 @@ public void write(final int udpPort, final Point point) {
this.batchProcessor.put(batchEntry);
} else {
this.write(udpPort, point.lineProtocol());
this.unBatchedCount.incrementAndGet();
this.unBatchedCount.increment();
}
this.writeCount.incrementAndGet();
this.writeCount.increment();
}

@Override
public void write(final BatchPoints batchPoints) {
this.batchedCount.addAndGet(batchPoints.getPoints().size());
this.batchedCount.add(batchPoints.getPoints().size());
RequestBody lineProtocol = RequestBody.create(MEDIA_TYPE_STRING, batchPoints.lineProtocol());
execute(this.influxDBService.writePoints(
this.username,
Expand Down

0 comments on commit d27c4db

Please sign in to comment.