This is an automated email from the ASF dual-hosted git repository. struberg pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/johnzon.git
commit f2d04b6155861e23eb779fa7be0f948276c5c7c3 Author: Mark Struberg <[email protected]> AuthorDate: Mon Jul 29 15:22:01 2019 +0200 JOHNZON-226 performance: avoid Array.getLength Array.getLength performs rather poor as it doesn't get inlined by the JIT due to heavy reflection. --- .../johnzon/mapper/MappingGeneratorImpl.java | 35 +++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java index f741aff..1b4d4e8 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java @@ -470,7 +470,7 @@ public class MappingGeneratorImpl implements MappingGenerator { * @param key either the attribute key or {@code null} if the array should be rendered without key */ private void writeArray(Class<?> type, Adapter itemConverter, String key, Object arrayValue, Collection<String> ignoredProperties, JsonPointerTracker jsonPointer) { - final int length = Array.getLength(arrayValue); + final int length = getArrayLength(arrayValue); if (length == 0 && config.isSkipEmptyArray()) { return; } @@ -582,6 +582,39 @@ public class MappingGeneratorImpl implements MappingGenerator { generator.writeEnd(); } + private int getArrayLength(Object array) { + // Note: all types of multidimensional arrays are instanceof Object[] + if (array instanceof Object[]) { + return ((Object[]) array).length; + } + if (array instanceof boolean[]) { + return ((boolean[])array).length; + } + if (array instanceof byte[]) { + return ((byte[])array).length; + } + if (array instanceof char[]) { + return ((char[]) array).length; + } + if (array instanceof short[]) { + return ((short[]) array).length; + } + if (array instanceof int[]) { + return ((int[]) array).length; + } + if (array instanceof long[]) { + return ((long[]) array).length; + } + if (array instanceof float[]) { + return ((float[]) array).length; + } + if (array instanceof double[]) { + return ((double[]) array).length; + } + + throw new IllegalArgumentException("This is not an array! " + array); + } + private void writeItem(final Object o, final Collection<String> ignoredProperties, JsonPointerTracker jsonPointer) { if (o == null) { generator.writeNull();
