use FastISODateParser.parseAsEpochMilli
Compared to FastISODateParser.parse, which returns an OffsetDateTime object, parseAsEpochMilli returns the epoch time millis. The performance improvement for date parsing alone is roughly 100% (8m dates/s to 18m dates/s). Insertion speed improved from 13-14s for 1.6m entries to 11.5-12.5s.
This commit is contained in:
@@ -53,7 +53,7 @@ public class PerformanceDb implements AutoCloseable {
|
||||
|
||||
public void putEntries(final BlockingIterator<Entry> entries) throws WriteException {
|
||||
|
||||
final Duration timeBetweenSyncs = Duration.ofSeconds(10);
|
||||
final Duration timeBetweenSyncs = Duration.ofSeconds(1);
|
||||
long count = 0;
|
||||
long insertionsSinceLastSync = 0;
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ public class PerformanceDbTest {
|
||||
public void testInsertRead() throws Exception {
|
||||
|
||||
try (PerformanceDb db = new PerformanceDb(dataDirectory)) {
|
||||
final OffsetDateTime date = DateUtils.nowInUtc();
|
||||
final long date = DateUtils.nowInUtc().toInstant().toEpochMilli();
|
||||
final long value = 1;
|
||||
final Tags tags = Tags.create("myKey", "myValue");
|
||||
db.putEntry(new Entry(date, value, tags));
|
||||
@@ -51,7 +51,7 @@ public class PerformanceDbTest {
|
||||
|
||||
Assert.assertEquals(stream.size(), 2);
|
||||
|
||||
Assert.assertEquals(stream.get(0), date.toInstant().toEpochMilli());
|
||||
Assert.assertEquals(stream.get(0), date);
|
||||
Assert.assertEquals(stream.get(1), value);
|
||||
}
|
||||
}
|
||||
@@ -59,8 +59,8 @@ public class PerformanceDbTest {
|
||||
public void testInsertIntoMultipleFilesRead() throws Exception {
|
||||
|
||||
try (PerformanceDb db = new PerformanceDb(dataDirectory)) {
|
||||
final OffsetDateTime dayOne = DateUtils.getDate(2016, 11, 1, 10, 0, 0);
|
||||
final OffsetDateTime dayTwo = DateUtils.getDate(2016, 11, 2, 12, 34, 56);
|
||||
final long dayOne = DateUtils.getDate(2016, 11, 1, 10, 0, 0).toInstant().toEpochMilli();
|
||||
final long dayTwo = DateUtils.getDate(2016, 11, 2, 12, 34, 56).toInstant().toEpochMilli();
|
||||
final long valueOne = 1;
|
||||
final long valueTwo = 2;
|
||||
final Tags tags = Tags.create("myKey", "myValue");
|
||||
@@ -72,9 +72,9 @@ public class PerformanceDbTest {
|
||||
|
||||
Assert.assertEquals(stream.size(), 4);
|
||||
|
||||
Assert.assertEquals(stream.get(0), dayOne.toInstant().toEpochMilli());
|
||||
Assert.assertEquals(stream.get(0), dayOne);
|
||||
Assert.assertEquals(stream.get(1), valueOne);
|
||||
Assert.assertEquals(stream.get(2), dayTwo.toInstant().toEpochMilli());
|
||||
Assert.assertEquals(stream.get(2), dayTwo);
|
||||
Assert.assertEquals(stream.get(3), valueTwo);
|
||||
}
|
||||
}
|
||||
@@ -86,8 +86,8 @@ public class PerformanceDbTest {
|
||||
|
||||
for (long i = 0; i < n; i++) {
|
||||
final long value = ThreadLocalRandom.current().nextInt(0, Integer.MAX_VALUE);
|
||||
final OffsetDateTime date = OffsetDateTime.ofInstant(Instant.ofEpochMilli(currentTime + addToDate),
|
||||
ZoneOffset.UTC);
|
||||
final long date = OffsetDateTime.ofInstant(Instant.ofEpochMilli(currentTime + addToDate), ZoneOffset.UTC)
|
||||
.toInstant().toEpochMilli();
|
||||
result.add(new Entry(date, value, tags));
|
||||
|
||||
currentTime += differenceInMs;
|
||||
@@ -333,7 +333,7 @@ public class PerformanceDbTest {
|
||||
|
||||
int index = 0;
|
||||
for (final Entry entry : entriesOne) {
|
||||
System.out.printf("%4d %s %d (%s)\n", index, entry.getDate(), entry.getValue(), label);
|
||||
System.out.printf("%4d %s %d (%s)\n", index, entry.getEpochMilli(), entry.getValue(), label);
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,18 +51,18 @@ public class TagsToFilesTest {
|
||||
final TagsToFile tagsToFile = new TagsToFile(dataStore);) {
|
||||
|
||||
// dayC is before dayA and dayB
|
||||
final OffsetDateTime dayA = DateUtils.getDate(2016, 1, 2, 1, 1, 1);
|
||||
final OffsetDateTime dayB = DateUtils.getDate(2016, 1, 3, 1, 1, 1);
|
||||
final OffsetDateTime dayC = DateUtils.getDate(2016, 1, 1, 1, 1, 1);
|
||||
final long dayA = DateUtils.getDate(2016, 1, 2, 1, 1, 1).toInstant().toEpochMilli();
|
||||
final long dayB = DateUtils.getDate(2016, 1, 3, 1, 1, 1).toInstant().toEpochMilli();
|
||||
final long dayC = DateUtils.getDate(2016, 1, 1, 1, 1, 1).toInstant().toEpochMilli();
|
||||
|
||||
final Tags tags = Tags.create("myKey", "myValue");
|
||||
|
||||
final PdbWriter writerForDayA = tagsToFile.getWriter(dayA.toInstant().toEpochMilli(), tags);
|
||||
final PdbWriter writerForDayA = tagsToFile.getWriter(dayA, tags);
|
||||
writerForDayA.write(new Entry(dayA, 1, tags));
|
||||
final PdbWriter writerForDayB = tagsToFile.getWriter(dayB.toInstant().toEpochMilli(), tags);
|
||||
final PdbWriter writerForDayB = tagsToFile.getWriter(dayB, tags);
|
||||
writerForDayB.write(new Entry(dayB, 2, tags));
|
||||
|
||||
final PdbWriter writerForDayC = tagsToFile.getWriter(dayC.toInstant().toEpochMilli(), tags);
|
||||
final PdbWriter writerForDayC = tagsToFile.getWriter(dayC, tags);
|
||||
writerForDayC.write(new Entry(dayC, 3, tags));
|
||||
|
||||
Assert.assertSame(writerForDayA, writerForDayB);
|
||||
@@ -75,14 +75,14 @@ public class TagsToFilesTest {
|
||||
try (final DataStore dataStore = new DataStore(dataDirectory); //
|
||||
final TagsToFile tagsToFile = new TagsToFile(dataStore)) {
|
||||
|
||||
final OffsetDateTime timestamp = DateUtils.getDate(2016, 1, 1, 13, 1, 1);
|
||||
final long timestamp = DateUtils.getDate(2016, 1, 1, 13, 1, 1).toInstant().toEpochMilli();
|
||||
|
||||
final Tags tags = Tags.create("myKey", "myValue");
|
||||
|
||||
final PdbWriter fileA = tagsToFile.getWriter(timestamp.toInstant().toEpochMilli(), tags);
|
||||
final PdbWriter fileA = tagsToFile.getWriter(timestamp, tags);
|
||||
fileA.write(new Entry(timestamp, 1, tags));
|
||||
|
||||
final PdbWriter fileB = tagsToFile.getWriter(timestamp.toInstant().toEpochMilli(), tags);
|
||||
final PdbWriter fileB = tagsToFile.getWriter(timestamp, tags);
|
||||
fileA.write(new Entry(timestamp, 2, tags));
|
||||
|
||||
Assert.assertEquals(fileA, fileB);
|
||||
|
||||
Reference in New Issue
Block a user