As that article says in conclusion, T[0] seems currently faster, but that
may not always be the case with future VMs.

Also it says that IntelliJ IDEA and PMD recommend using T[size] rather than
T[0].
If we release code with T[0], I suspect we will get complaints that the
code is not efficient according to x, y and z.

I'm not convinced that the change is worth it, but if it is agreed the code
must be thoroughly documented to try and forestall complaints.
According to the article, using a constant empty array is faster, but only
marginally. If there is a constant available it would probably make sense
to use it.
This should also be documented, as it affects the return value for the
empty case.

S.
On Fri, 27 Dec 2019 at 09:28, Pascal Schumacher <pascalschumac...@gmx.net>
wrote:

> see https://shipilev.net/blog/2016/arrays-wisdom-ancients/
>
> Am 27.12.2019 um 01:24 schrieb sebb:
> > Also, where is it documented that modern JVMs are faster?
> > To which JVMs does this apply?
> >
> > S.
> >
> > On Thu, 26 Dec 2019 at 22:08, Gary Gregory <garydgreg...@gmail.com>
> wrote:
> >
> >> Please do not cause garbage to apparently be generated all over the
> place
> >> by creating new empty arrays all the time. Use the constants Commons
> Lang
> >> constants already defines; see ArrayUtils.
> >>
> >> Gary
> >>
> >> On Thu, Dec 26, 2019 at 4:48 PM <pascalschumac...@apache.org> wrote:
> >>
> >>> This is an automated email from the ASF dual-hosted git repository.
> >>>
> >>> pascalschumacher pushed a commit to branch master
> >>> in repository https://gitbox.apache.org/repos/asf/commons-lang.git
> >>>
> >>>
> >>> The following commit(s) were added to refs/heads/master by this push:
> >>>       new 84668a2  Use Collection#toArray(new T[0]) instead of a
> presized
> >>> array as it is faster on modern JVMs.
> >>> 84668a2 is described below
> >>>
> >>> commit 84668a2d980316a580030fd64764cb072b520b09
> >>> Author: pascalschumacher <pascalschumac...@gmx.net>
> >>> AuthorDate: Thu Dec 26 22:48:12 2019 +0100
> >>>
> >>>      Use Collection#toArray(new T[0]) instead of a presized array as
> it is
> >>> faster on modern JVMs.
> >>> ---
> >>>   src/main/java/org/apache/commons/lang3/CharSet.java            |  2
> +-
> >>>   src/main/java/org/apache/commons/lang3/StringUtils.java        | 10
> >>> +++++-----
> >>>   .../org/apache/commons/lang3/exception/ExceptionUtils.java     |  6
> >> +++---
> >>>   src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java |  4
> ++--
> >>>   .../java/org/apache/commons/lang3/reflect/MethodUtils.java     |  2
> +-
> >>>   src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java  |  2
> +-
> >>>   src/main/java/org/apache/commons/lang3/text/StrTokenizer.java  |  4
> ++--
> >>>   .../org/apache/commons/lang3/time/DurationFormatUtils.java     |  2
> +-
> >>>   .../java/org/apache/commons/lang3/time/FastDatePrinter.java    |  2
> +-
> >>>   .../commons/lang3/concurrent/EventCountCircuitBreakerTest.java |  2
> +-
> >>>   10 files changed, 18 insertions(+), 18 deletions(-)
> >>>
> >>> diff --git a/src/main/java/org/apache/commons/lang3/CharSet.java
> >>> b/src/main/java/org/apache/commons/lang3/CharSet.java
> >>> index 3fdfd07..7955115 100644
> >>> --- a/src/main/java/org/apache/commons/lang3/CharSet.java
> >>> +++ b/src/main/java/org/apache/commons/lang3/CharSet.java
> >>> @@ -225,7 +225,7 @@ public class CharSet implements Serializable {
> >>>   // NOTE: This is no longer public as CharRange is no longer a public
> >>> class.
> >>>   //       It may be replaced when CharSet moves to Range.
> >>>       /*public*/ CharRange[] getCharRanges() {
> >>> -        return set.toArray(new CharRange[set.size()]);
> >>> +        return set.toArray(new CharRange[0]);
> >>>       }
> >>>
> >>>
> >>>
> >>
> //-----------------------------------------------------------------------
> >>> diff --git a/src/main/java/org/apache/commons/lang3/StringUtils.java
> >>> b/src/main/java/org/apache/commons/lang3/StringUtils.java
> >>> index abde7ec..d629806 100644
> >>> --- a/src/main/java/org/apache/commons/lang3/StringUtils.java
> >>> +++ b/src/main/java/org/apache/commons/lang3/StringUtils.java
> >>> @@ -7507,7 +7507,7 @@ public class StringUtils {
> >>>               currentType = type;
> >>>           }
> >>>           list.add(new String(c, tokenStart, c.length - tokenStart));
> >>> -        return list.toArray(new String[list.size()]);
> >>> +        return list.toArray(new String[0]);
> >>>       }
> >>>
> >>>       /**
> >>> @@ -7735,7 +7735,7 @@ public class StringUtils {
> >>>               }
> >>>           }
> >>>
> >>> -        return substrings.toArray(new String[substrings.size()]);
> >>> +        return substrings.toArray(new String[0]);
> >>>       }
> >>>
> >>>       //
> >>> -----------------------------------------------------------------------
> >>> @@ -7923,7 +7923,7 @@ public class StringUtils {
> >>>           if (match || preserveAllTokens && lastMatch) {
> >>>               list.add(str.substring(start, i));
> >>>           }
> >>> -        return list.toArray(new String[list.size()]);
> >>> +        return list.toArray(new String[0]);
> >>>       }
> >>>
> >>>       /**
> >>> @@ -8022,7 +8022,7 @@ public class StringUtils {
> >>>           if (match || preserveAllTokens && lastMatch) {
> >>>               list.add(str.substring(start, i));
> >>>           }
> >>> -        return list.toArray(new String[list.size()]);
> >>> +        return list.toArray(new String[0]);
> >>>       }
> >>>
> >>>       /**
> >>> @@ -8835,7 +8835,7 @@ public class StringUtils {
> >>>           if (list.isEmpty()) {
> >>>               return null;
> >>>           }
> >>> -        return list.toArray(new String[list.size()]);
> >>> +        return list.toArray(new String[0]);
> >>>       }
> >>>
> >>>       /**
> >>> diff --git
> >>> a/src/main/java/org/apache/commons/lang3/exception/ExceptionUtils.java
> >>> b/src/main/java/org/apache/commons/lang3/exception/ExceptionUtils.java
> >>> index 5969614..dd154e3 100644
> >>> ---
> >> a/src/main/java/org/apache/commons/lang3/exception/ExceptionUtils.java
> >>> +++
> >> b/src/main/java/org/apache/commons/lang3/exception/ExceptionUtils.java
> >>> @@ -274,7 +274,7 @@ public class ExceptionUtils {
> >>>               }
> >>>               frames.addAll(trace);
> >>>           }
> >>> -        return frames.toArray(new String[frames.size()]);
> >>> +        return frames.toArray(new String[0]);
> >>>       }
> >>>
> >>>       /**
> >>> @@ -325,7 +325,7 @@ public class ExceptionUtils {
> >>>           while (frames.hasMoreTokens()) {
> >>>               list.add(frames.nextToken());
> >>>           }
> >>> -        return list.toArray(new String[list.size()]);
> >>> +        return list.toArray(new String[0]);
> >>>       }
> >>>
> >>>       /**
> >>> @@ -438,7 +438,7 @@ public class ExceptionUtils {
> >>>        */
> >>>       public static Throwable[] getThrowables(final Throwable
> throwable) {
> >>>           final List<Throwable> list = getThrowableList(throwable);
> >>> -        return list.toArray(new Throwable[list.size()]);
> >>> +        return list.toArray(new Throwable[0]);
> >>>       }
> >>>
> >>>       /**
> >>> diff --git
> >>> a/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java
> >>> b/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java
> >>> index d72dc53..553be4e 100644
> >>> --- a/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java
> >>> +++ b/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java
> >>> @@ -199,7 +199,7 @@ public class FieldUtils {
> >>>        */
> >>>       public static Field[] getAllFields(final Class<?> cls) {
> >>>           final List<Field> allFieldsList = getAllFieldsList(cls);
> >>> -        return allFieldsList.toArray(new Field[allFieldsList.size()]);
> >>> +        return allFieldsList.toArray(new Field[0]);
> >>>       }
> >>>
> >>>       /**
> >>> @@ -237,7 +237,7 @@ public class FieldUtils {
> >>>        */
> >>>       public static Field[] getFieldsWithAnnotation(final Class<?> cls,
> >>> final Class<? extends Annotation> annotationCls) {
> >>>           final List<Field> annotatedFieldsList =
> >>> getFieldsListWithAnnotation(cls, annotationCls);
> >>> -        return annotatedFieldsList.toArray(new
> >>> Field[annotatedFieldsList.size()]);
> >>> +        return annotatedFieldsList.toArray(new Field[0]);
> >>>       }
> >>>
> >>>       /**
> >>> diff --git
> >>> a/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java
> >>> b/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java
> >>> index bbd5019..491470d 100644
> >>> --- a/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java
> >>> +++ b/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java
> >>> @@ -878,7 +878,7 @@ public class MethodUtils {
> >>>                                                       final boolean
> >>> searchSupers, final boolean ignoreAccess) {
> >>>           final List<Method> annotatedMethodsList =
> >>> getMethodsListWithAnnotation(cls, annotationCls, searchSupers,
> >>>                   ignoreAccess);
> >>> -        return annotatedMethodsList.toArray(new
> >>> Method[annotatedMethodsList.size()]);
> >>> +        return annotatedMethodsList.toArray(new Method[0]);
> >>>       }
> >>>
> >>>       /**
> >>> diff --git
> >> a/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java
> >>> b/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java
> >>> index 2a6ccd0..f9df8c6 100644
> >>> --- a/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java
> >>> +++ b/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java
> >>> @@ -1149,7 +1149,7 @@ public class TypeUtils {
> >>>               }
> >>>           }
> >>>
> >>> -        return types.toArray(new Type[types.size()]);
> >>> +        return types.toArray(new Type[0]);
> >>>       }
> >>>
> >>>       /**
> >>> diff --git
> >> a/src/main/java/org/apache/commons/lang3/text/StrTokenizer.java
> >>> b/src/main/java/org/apache/commons/lang3/text/StrTokenizer.java
> >>> index c9ab666..97fae7d 100644
> >>> --- a/src/main/java/org/apache/commons/lang3/text/StrTokenizer.java
> >>> +++ b/src/main/java/org/apache/commons/lang3/text/StrTokenizer.java
> >>> @@ -604,10 +604,10 @@ public class StrTokenizer implements
> >>> ListIterator<String>, Cloneable {
> >>>               if (chars == null) {
> >>>                   // still call tokenize as subclass may do some work
> >>>                   final List<String> split = tokenize(null, 0, 0);
> >>> -                tokens = split.toArray(new String[split.size()]);
> >>> +                tokens = split.toArray(new String[0]);
> >>>               } else {
> >>>                   final List<String> split = tokenize(chars, 0,
> >>> chars.length);
> >>> -                tokens = split.toArray(new String[split.size()]);
> >>> +                tokens = split.toArray(new String[0]);
> >>>               }
> >>>           }
> >>>       }
> >>> diff --git
> >>> a/src/main/java/org/apache/commons/lang3/time/DurationFormatUtils.java
> >>> b/src/main/java/org/apache/commons/lang3/time/DurationFormatUtils.java
> >>> index 83af2e0..4a75237 100644
> >>> ---
> >> a/src/main/java/org/apache/commons/lang3/time/DurationFormatUtils.java
> >>> +++
> >> b/src/main/java/org/apache/commons/lang3/time/DurationFormatUtils.java
> >>> @@ -564,7 +564,7 @@ public class DurationFormatUtils {
> >>>           if (inLiteral) { // i.e. we have not found the end of the
> >> literal
> >>>               throw new IllegalArgumentException("Unmatched quote in
> >>> format: " + format);
> >>>           }
> >>> -        return list.toArray(new Token[list.size()]);
> >>> +        return list.toArray(new Token[0]);
> >>>       }
> >>>
> >>>
> >>>
> >>
> //-----------------------------------------------------------------------
> >>> diff --git
> >>> a/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java
> >>> b/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java
> >>> index a5edb28..888d3fb 100644
> >>> --- a/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java
> >>> +++ b/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java
> >>> @@ -160,7 +160,7 @@ public class FastDatePrinter implements
> DatePrinter,
> >>> Serializable {
> >>>        */
> >>>       private void init() {
> >>>           final List<Rule> rulesList = parsePattern();
> >>> -        mRules = rulesList.toArray(new Rule[rulesList.size()]);
> >>> +        mRules = rulesList.toArray(new Rule[0]);
> >>>
> >>>           int len = 0;
> >>>           for (int i=mRules.length; --i >= 0; ) {
> >>> diff --git
> >>>
> >>
> a/src/test/java/org/apache/commons/lang3/concurrent/EventCountCircuitBreakerTest.java
> >>
> b/src/test/java/org/apache/commons/lang3/concurrent/EventCountCircuitBreakerTest.java
> >>> index b3fb5cf..2819006 100644
> >>> ---
> >>>
> >>
> a/src/test/java/org/apache/commons/lang3/concurrent/EventCountCircuitBreakerTest.java
> >>> +++
> >>>
> >>
> b/src/test/java/org/apache/commons/lang3/concurrent/EventCountCircuitBreakerTest.java
> >>> @@ -407,7 +407,7 @@ public class EventCountCircuitBreakerTest {
> >>>            */
> >>>           public void verify(final Boolean... values) {
> >>>               assertArrayEquals(values,
> >>> -                    changedValues.toArray(new
> >>> Boolean[changedValues.size()]));
> >>> +                    changedValues.toArray(new Boolean[0]));
> >>>           }
> >>>       }
> >>>   }
> >>>
> >>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
>
>

Reply via email to