From 00a070a37d2601942c83f7425dd3d4c45fbc237b Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Wed, 16 Jul 2025 21:15:56 +0100 Subject: [PATCH] [XMLBeans-483] further perf optimisation in array setter --- .../impl/values/XmlComplexContentImpl.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java b/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java index 245d6d172..69a088b8e 100644 --- a/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java +++ b/src/main/java/org/apache/xmlbeans/impl/values/XmlComplexContentImpl.java @@ -407,19 +407,20 @@ protected void arraySetterHelper(XmlObject[] sources, QName elemName, QNameSet s m = startPos; } - int j; - for (i = startSrc, j = startDest; i < n; i++, j++) { - TypeStoreUser user; - - if (j >= m) { - user = store.add_element_user(elemName); - } else if (set == null) { - user = store.find_element_user(elemName, j); - } else { - user = store.find_element_user(set, j); - } + final int size = Math.min(m - startDest, sources.length - startSrc); + ArrayList users = new ArrayList<>(size); + if (set == null) { + store.find_multiple_element_users(elemName, users, size); + } else { + store.find_multiple_element_users(set, users, size); + } + i = startSrc; + for (XmlObjectBase user : users) { + user.set(sources[i++]); + } - ((XmlObjectBase) user).set(sources[i]); + for (TypeStoreUser u : store.add_elements_users(elemName, n - i)) { + ((XmlObjectBase) u).set(sources[i++]); } // We can't just delegate to array_setter because we need