From 4d0ea4c8297150d6b73476cbc305ef0680e18ab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viktor=20Szathma=CC=81ry?= Date: Mon, 14 Dec 2015 09:21:48 +0100 Subject: [PATCH] Decoder perf: reuse ObjectMapper, static ptr offsets ObjectMapper is in fact thread-safe (see https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/ObjectMapper.html). Yields a ~3-5% improvement in Benchmark. Also, pointer offsets should be static. Negligible perf impact, more of a stylistic improvement. --- src/main/java/com/maxmind/db/Decoder.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/maxmind/db/Decoder.java b/src/main/java/com/maxmind/db/Decoder.java index dbb37b16..a626ddbb 100644 --- a/src/main/java/com/maxmind/db/Decoder.java +++ b/src/main/java/com/maxmind/db/Decoder.java @@ -17,14 +17,16 @@ * This class CANNOT be shared between threads */ final class Decoder { + private static final Charset UTF_8 = Charset.forName("UTF-8"); + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + // XXX - This is only for unit testings. We should possibly make a // constructor to set this boolean POINTER_TEST_HACK = false; - private final long pointerBase; - private final ObjectMapper objectMapper; + private final long pointerBase; private final CharsetDecoder utfDecoder = UTF_8.newDecoder(); @@ -78,7 +80,6 @@ void setOffset(int offset) { Decoder(ByteBuffer buffer, long pointerBase) { this.pointerBase = pointerBase; this.buffer = buffer; - this.objectMapper = new ObjectMapper(); } Result decode(int offset) throws IOException { @@ -175,7 +176,7 @@ private Result decodeByType(Type type, int offset, int size) } } - private final int[] pointerValueOffset = {0, 0, 1 << 11, + private static final int[] POINTER_VALUE_OFFSETS = {0, 0, 1 << 11, (1 << 19) + ((1) << 11), 0}; private Result decodePointer(int ctrlByte, int offset) { @@ -183,7 +184,7 @@ private Result decodePointer(int ctrlByte, int offset) { int base = pointerSize == 4 ? (byte) 0 : (byte) (ctrlByte & 0x7); int packed = this.decodeInteger(base, pointerSize); long pointer = packed + this.pointerBase - + this.pointerValueOffset[pointerSize]; + + POINTER_VALUE_OFFSETS[pointerSize]; return new Result(new LongNode(pointer), offset + pointerSize); } @@ -270,7 +271,7 @@ private static BooleanNode decodeBoolean(int size) } private Result decodeArray(int size, int offset) throws IOException { - ArrayNode array = this.objectMapper.createArrayNode(); + ArrayNode array = OBJECT_MAPPER.createArrayNode(); for (int i = 0; i < size; i++) { Result r = this.decode(offset); @@ -282,7 +283,7 @@ private Result decodeArray(int size, int offset) throws IOException { } private Result decodeMap(int size, int offset) throws IOException { - ObjectNode map = this.objectMapper.createObjectNode(); + ObjectNode map = OBJECT_MAPPER.createObjectNode(); for (int i = 0; i < size; i++) { Result keyResult = this.decode(offset);