Skip to content

Commit dcbc951

Browse files
committedNov 9, 2022
Polishing.
Replace String.format(…) with our own digit rendering and padding to reduce computation on hot code paths. [resolves #558][#556] Signed-off-by: Mark Paluch <mpaluch@vmware.com>
1 parent 44d8d76 commit dcbc951

File tree

3 files changed

+19
-6
lines changed

3 files changed

+19
-6
lines changed
 

‎src/main/java/io/r2dbc/postgresql/codec/NumericDecodeUtils.java

+11-5
Original file line numberDiff line numberDiff line change
@@ -111,18 +111,24 @@ public static BigDecimal decodeBinary(ByteBuf byteBuf) {
111111
digits[i] = byteBuf.readShort();
112112
}
113113

114-
StringBuilder sb = new StringBuilder();
114+
StringBuilder sb = new StringBuilder((sign != 0 ? 1 : 0) + 2 + (digits.length * 4));
115115
if (sign != 0) {
116116
sb.append("-");
117117
}
118118
sb.append("0.");
119119
for (short digit : digits) {
120-
sb.append(String.format("%04d", digit));
120+
String rendered = "" + digit;
121+
int padded = rendered.length();
122+
123+
while (padded < 4) {
124+
sb.append("0");
125+
padded++;
126+
}
127+
128+
sb.append(rendered);
121129
}
122130

123-
return new BigDecimal(sb.toString())
124-
.movePointRight((weight + 1) * 4)
125-
.setScale(scale, RoundingMode.DOWN);
131+
return new BigDecimal(sb.toString()).movePointRight((weight + 1) * 4).setScale(scale, RoundingMode.DOWN);
126132
}
127133

128134
}

‎src/test/java/io/r2dbc/postgresql/AbstractCodecIntegrationTests.java

+3
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,10 @@ void bigDecimal() {
103103
testCodec(BigDecimal.class, new BigDecimal("-1"), "NUMERIC");
104104
testCodec(BigDecimal.class, new BigDecimal("10000.0000023"), "NUMERIC");
105105
testCodec(BigDecimal.class, new BigDecimal("10010.1200023"), "NUMERIC");
106+
testCodec(BigDecimal.class, new BigDecimal("-10010.1200023"), "NUMERIC");
106107
testCodec(BigDecimal.class, new BigDecimal("2000010010.1200023"), "NUMERIC");
108+
testCodec(BigDecimal.class, new BigDecimal("0.1200023"), "NUMERIC");
109+
testCodec(BigDecimal.class, new BigDecimal("-0.1200023"), "NUMERIC");
107110
testCodec(BigDecimal.class, new BigDecimal("0"), "NUMERIC");
108111
testCodec(BigDecimal.class, new BigDecimal("100"), "INT2");
109112
testCodec(BigDecimal.class, new BigDecimal("100"), "INT4");

‎src/test/java/io/r2dbc/postgresql/codec/NumericDecodeUtilsTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313

1414
import static org.assertj.core.api.Assertions.assertThat;
1515

16+
/**
17+
* Unit tests for {@link NumericDecodeUtils}.
18+
*/
1619
class NumericDecodeUtilsTest {
1720

1821
static Stream<Object[]> bigDecimalValues() {
@@ -82,6 +85,7 @@ void decodeBinary2(BigDecimal value) {
8285
ByteBuf byteBuf = TestByteBufAllocator.TEST.buffer();
8386
byteBuf.writeBytes(ByteConverter.numeric(value));
8487
assertThat(NumericDecodeUtils.decodeBinary(byteBuf)).isEqualByComparingTo(value);
88+
byteBuf.release();
8589
}
8690

87-
}
91+
}

0 commit comments

Comments
 (0)
Please sign in to comment.