commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Peter Ansell <ansell.pe...@gmail.com>
Subject Re: [lang] Allocate array of the correct size
Date Tue, 05 May 2015 23:56:09 GMT
On 6 May 2015 at 01:51, Jörg Schaible <joerg.schaible@swisspost.com> wrote:
> Hi Benedikt,
>
> Benedikt Ritter wrote:
>
>> 2015-05-05 14:52 GMT+02:00 Benedikt Ritter <britter@apache.org>:
>>
>>> Hello Jörg,
>>>
>>> 2015-05-05 8:30 GMT+02:00 Jörg Schaible <joerg.schaible@swisspost.com>:
>>>
>>>> Hi Benedikt,
>>>>
>>>> britter@apache.org wrote:
>>>>
>>>> > Repository: commons-lang
>>>> > Updated Branches:
>>>> >   refs/heads/master 8548b12d8 -> 60b32953a
>>>> >
>>>> >
>>>> > Allocate array of the correct size
>>>> >
>>>> >
>>>> > Project: http://git-wip-us.apache.org/repos/asf/commons-lang/repo
>>>> > Commit:
>>>> > http://git-wip-us.apache.org/repos/asf/commons-lang/commit/60b32953
>>>> Tree:
>>>> > http://git-wip-us.apache.org/repos/asf/commons-lang/tree/60b32953
>>>> > Diff:
>>>> > http://git-wip-us.apache.org/repos/asf/commons-lang/diff/60b32953
>>>> >
>>>> > Branch: refs/heads/master
>>>> > Commit: 60b32953a968e5623f82a6b27d6c679bc17c48e5
>>>> > Parents: 8548b12
>>>> > Author: Benedikt Ritter <britter@apache.org>
>>>> > Authored: Mon May 4 21:26:07 2015 +0200
>>>> > Committer: Benedikt Ritter
>>>> > <britter@apache.org> Committed: Mon May 4
>>>> > 21:26:07 2015 +0200
>>>> >
>>>> > ----------------------------------------------------------------------
>>>> >  .../apache/commons/lang3/builder/ReflectionToStringBuilder.java   
|
>>>> >  2
>>>> +-
>>>> >  1 file changed, 1 insertion(+), 1 deletion(-)
>>>> > ----------------------------------------------------------------------
>>>> >
>>>> >
>>>> >
>>>> http://git-wip-us.apache.org/repos/asf/commons-lang/blob/60b32953/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
>>>> > ----------------------------------------------------------------------
>>>> > diff --git
>>>> >
>>>>
>>>>
> a/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
>>>> >
>>>>
>>>>
> b/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
>>>> > index 5904469..7a78170 100644 ---
>>>> >
>>>>
>>>>
> a/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
>>>> > +++
>>>> >
>>>>
>>>>
> b/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
>>>> > @@ -333,7 +333,7 @@ public class ReflectionToStringBuilder extends
>>>> > ToStringBuilder {
>>>> >                  list.add(e.toString());
>>>> >              }
>>>> >          }
>>>> > -        return list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
>>>> > +        return list.toArray(new String[list.size()]);
>>>> >      }
>>>>
>>>> What's the benefit of this? Where's the difference by letting
>>>> List.toArray()
>>>> allocate the appropriate array compared to do it on your own?
>>>> ArrayUtils.EMPTY_STRING is a constant after all, so there's no
>>>> additional allocation.
>>>>
>>>
>>> I changed this because my IDE complained about that line of code:
>>>
>>> "Call to 'toArray' with zero-length array argument
>>> 'ArrayUtils.EMPTY_STRING_ARRAY'
>>>
>>> Reports any call to 'toArray' on an object or type or subtype of
>>> java.util.Collection with a zero-length argument. When passing an array
>>> of too small size, the toArray() method has to construct a new array of
>>> the correct size using reflection. This has significantly worse
>>> performance than passing in an array of at least the size of the
>>> collection itself."
>>>
>>> To be honest, I did not do any performance benchmarks to make sure this
>>> is really true.
>>>
>>
>> In any case, the commit message should have been more explanatory. Sorry
>> about that.
>
> Well, that warning is somewhat stupid, if you're using a constant for the
> zero length array. The "worse performance" only occurs if you provide a new
> array instance that is too small.

The worse performance would be in reflection overhead as reflection
may always be used to derive the class for a new array if you are
passing in an empty array. There is no need for any microbenchmarks on
different JVMs if reflection is used at all in the zero length array
method on any JVM. The reflection method will necessarily have more
CPU instructions than a native array allocation of the correct size
which is done in compiled code and JIT'ed without any reflection
calls.

Cheers,

Peter

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Mime
View raw message