Skip to content

Commit 9fcfa59

Browse files
committed
Reduce size of buffer, stringBuffer and tape.
In class JsonValue, the default size of buffer and stringBuffer, as well as long[] tape in class Tape, is 34M. But in practice it's not necessary. This patch reduce the size of them from 34M to its actual size.
1 parent 84736d5 commit 9fcfa59

File tree

4 files changed

+21
-4
lines changed

4 files changed

+21
-4
lines changed

src/main/java/org/simdjson/SimdJsonParser.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class SimdJsonParser {
1111
private final StructuralIndexer indexer;
1212
private final BitIndexes bitIndexes;
1313
private final JsonIterator jsonIterator;
14-
private final byte[] paddedBuffer;
14+
private final int capacity;
1515

1616
public SimdJsonParser() {
1717
this(DEFAULT_CAPACITY, DEFAULT_MAX_DEPTH);
@@ -20,7 +20,7 @@ public SimdJsonParser() {
2020
public SimdJsonParser(int capacity, int maxDepth) {
2121
bitIndexes = new BitIndexes(capacity);
2222
jsonIterator = new JsonIterator(bitIndexes, capacity, maxDepth, PADDING);
23-
paddedBuffer = new byte[capacity];
23+
this.capacity = capacity;
2424
reader = new BlockReader(STEP_SIZE);
2525
indexer = new StructuralIndexer(bitIndexes);
2626
}
@@ -34,7 +34,8 @@ public JsonValue parse(byte[] buffer, int len) {
3434
}
3535

3636
private byte[] padIfNeeded(byte[] buffer, int len) {
37-
if (buffer.length - len < PADDING) {
37+
if (buffer.length - len < PADDING && len < capacity) {
38+
byte[] paddedBuffer = new byte[len + PADDING];
3839
System.arraycopy(buffer, 0, paddedBuffer, 0, len);
3940
return paddedBuffer;
4041
}

src/main/java/org/simdjson/StringParser.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ class StringParser {
2626
this.stringBuffer = stringBuffer;
2727
}
2828

29+
int getStringBufferIdx() {
30+
return stringBufferIdx;
31+
}
32+
2933
void parseString(byte[] buffer, int idx) {
3034
tape.append(stringBufferIdx, STRING);
3135
int src = idx + 1;

src/main/java/org/simdjson/Tape.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ class Tape {
2525
tape = new long[capacity];
2626
}
2727

28+
Tape(Tape other) {
29+
this.tape = new long[other.tapeIdx];
30+
System.arraycopy(other.tape, 0, this.tape, 0, other.tapeIdx);
31+
this.tapeIdx = other.tapeIdx;
32+
}
33+
2834
void append(long val, char type) {
2935
tape[tapeIdx] = val | (((long) type) << 56);
3036
tapeIdx++;

src/main/java/org/simdjson/TapeBuilder.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,13 @@ void reset() {
206206
}
207207

208208
JsonValue createJsonValue(byte[] buffer) {
209-
return new JsonValue(tape, 1, stringBuffer, buffer);
209+
Tape newTape = new Tape(tape);
210+
211+
int stringBufferLen = stringParser.getStringBufferIdx();
212+
byte[] newStringBuffer = new byte[stringBufferLen];
213+
System.arraycopy(stringBuffer, 0, newStringBuffer, 0, stringBufferLen);
214+
215+
return new JsonValue(newTape, 1, newStringBuffer, buffer);
210216
}
211217

212218
private static class OpenContainer {

0 commit comments

Comments
 (0)