Skip to content

Commit f8c4536

Browse files
committed
Merge pull request #16 from phraktle/perf-opt
Optimizations for String decoding
2 parents f3489b3 + 61e98ed commit f8c4536

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

src/main/java/com/maxmind/db/Decoder.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import java.io.IOException;
44
import java.math.BigInteger;
55
import java.nio.ByteBuffer;
6+
import java.nio.charset.CharacterCodingException;
67
import java.nio.charset.Charset;
8+
import java.nio.charset.CharsetDecoder;
79

810
import com.fasterxml.jackson.databind.JsonNode;
911
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -15,13 +17,17 @@
1517
* This class CANNOT be shared between threads
1618
*/
1719
final class Decoder {
20+
private static final Charset UTF_8 = Charset.forName("UTF-8");
21+
1822
// XXX - This is only for unit testings. We should possibly make a
1923
// constructor to set this
2024
boolean POINTER_TEST_HACK = false;
2125
private final long pointerBase;
2226

2327
private final ObjectMapper objectMapper;
2428

29+
private final CharsetDecoder utfDecoder = UTF_8.newDecoder();
30+
2531
private final ByteBuffer buffer;
2632

2733
static enum Type {
@@ -182,10 +188,12 @@ private Result decodePointer(int ctrlByte, int offset) {
182188
return new Result(new LongNode(pointer), offset + pointerSize);
183189
}
184190

185-
private String decodeString(int size) {
186-
ByteBuffer buffer = this.buffer.slice();
187-
buffer.limit(size);
188-
return Charset.forName("UTF-8").decode(buffer).toString();
191+
private String decodeString(int size) throws CharacterCodingException {
192+
int oldLimit = buffer.limit();
193+
buffer.limit(buffer.position() + size);
194+
String s = utfDecoder.decode(buffer).toString();
195+
buffer.limit(oldLimit);
196+
return s;
189197
}
190198

191199
private IntNode decodeUint16(int size) {

0 commit comments

Comments
 (0)