Skip to content

Commit 8c603fd

Browse files
committed
Shortens AbstractIonWriter.writeValues, allowing the JIT to optimize it more efficiently, improving performance by up to 12%.
1 parent 900a0b1 commit 8c603fd

1 file changed

Lines changed: 75 additions & 69 deletions

File tree

‎src/main/java/com/amazon/ion/impl/bin/AbstractIonWriter.java‎

Lines changed: 75 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -127,80 +127,86 @@ public final void writeValueRecursive(final IonReader reader) throws IOException
127127
stepOut();
128128
continue;
129129
}
130-
131-
final SymbolToken fieldName = reader.getFieldNameSymbol();
132-
if (fieldName != null && !isFieldNameSet() && isInStruct()) {
133-
setFieldNameSymbol(fieldName);
134-
}
135-
final SymbolToken[] annotations = reader.getTypeAnnotationSymbols();
136-
if (annotations.length > 0) {
137-
setTypeAnnotationSymbols(annotations);
138-
}
130+
transferFieldNameAndAnnotations(reader);
139131
if (reader.isNullValue()) {
140132
writeNull(type);
141133
continue;
142134
}
135+
writeCurrentValue(type, reader);
136+
}
137+
}
143138

144-
switch (type) {
145-
case BOOL:
146-
final boolean booleanValue = reader.booleanValue();
147-
writeBool(booleanValue);
148-
break;
149-
case INT:
150-
switch (reader.getIntegerSize()) {
151-
case INT:
152-
final int intValue = reader.intValue();
153-
writeInt(intValue);
154-
break;
155-
case LONG:
156-
final long longValue = reader.longValue();
157-
writeInt(longValue);
158-
break;
159-
case BIG_INTEGER:
160-
final BigInteger bigIntegerValue = reader.bigIntegerValue();
161-
writeInt(bigIntegerValue);
162-
break;
163-
default:
164-
throw new IllegalStateException();
165-
}
166-
break;
167-
case FLOAT:
168-
final double doubleValue = reader.doubleValue();
169-
writeFloat(doubleValue);
170-
break;
171-
case DECIMAL:
172-
final Decimal decimalValue = reader.decimalValue();
173-
writeDecimal(decimalValue);
174-
break;
175-
case TIMESTAMP:
176-
final Timestamp timestampValue = reader.timestampValue();
177-
writeTimestamp(timestampValue);
178-
break;
179-
case SYMBOL:
180-
final SymbolToken symbolToken = reader.symbolValue();
181-
writeSymbolToken(symbolToken);
182-
break;
183-
case STRING:
184-
final String stringValue = reader.stringValue();
185-
writeString(stringValue);
186-
break;
187-
case CLOB:
188-
final byte[] clobValue = reader.newBytes();
189-
writeClob(clobValue);
190-
break;
191-
case BLOB:
192-
final byte[] blobValue = reader.newBytes();
193-
writeBlob(blobValue);
194-
break;
195-
case LIST:
196-
case SEXP:
197-
case STRUCT:
198-
reader.stepIn();
199-
stepIn(type);
200-
break;
201-
default:
202-
throw new IllegalStateException("Unexpected type: " + type);
203-
}
139+
private void transferFieldNameAndAnnotations(IonReader reader) {
140+
final SymbolToken fieldName = reader.getFieldNameSymbol();
141+
if (fieldName != null && !isFieldNameSet() && isInStruct()) {
142+
setFieldNameSymbol(fieldName);
143+
}
144+
final SymbolToken[] annotations = reader.getTypeAnnotationSymbols();
145+
if (annotations.length > 0) {
146+
setTypeAnnotationSymbols(annotations);
147+
}
148+
}
149+
150+
private void writeCurrentValue(IonType type, IonReader reader) throws IOException {
151+
switch (type) {
152+
case BOOL:
153+
final boolean booleanValue = reader.booleanValue();
154+
writeBool(booleanValue);
155+
break;
156+
case INT:
157+
switch (reader.getIntegerSize()) {
158+
case INT:
159+
final int intValue = reader.intValue();
160+
writeInt(intValue);
161+
break;
162+
case LONG:
163+
final long longValue = reader.longValue();
164+
writeInt(longValue);
165+
break;
166+
case BIG_INTEGER:
167+
final BigInteger bigIntegerValue = reader.bigIntegerValue();
168+
writeInt(bigIntegerValue);
169+
break;
170+
default:
171+
throw new IllegalStateException();
172+
}
173+
break;
174+
case FLOAT:
175+
final double doubleValue = reader.doubleValue();
176+
writeFloat(doubleValue);
177+
break;
178+
case DECIMAL:
179+
final Decimal decimalValue = reader.decimalValue();
180+
writeDecimal(decimalValue);
181+
break;
182+
case TIMESTAMP:
183+
final Timestamp timestampValue = reader.timestampValue();
184+
writeTimestamp(timestampValue);
185+
break;
186+
case SYMBOL:
187+
final SymbolToken symbolToken = reader.symbolValue();
188+
writeSymbolToken(symbolToken);
189+
break;
190+
case STRING:
191+
final String stringValue = reader.stringValue();
192+
writeString(stringValue);
193+
break;
194+
case CLOB:
195+
final byte[] clobValue = reader.newBytes();
196+
writeClob(clobValue);
197+
break;
198+
case BLOB:
199+
final byte[] blobValue = reader.newBytes();
200+
writeBlob(blobValue);
201+
break;
202+
case LIST:
203+
case SEXP:
204+
case STRUCT:
205+
reader.stepIn();
206+
stepIn(type);
207+
break;
208+
default:
209+
throw new IllegalStateException("Unexpected type: " + type);
204210
}
205211
}
206212

0 commit comments

Comments
 (0)