HashCodeBuilder append(Object) could be more efficient
------------------------------------------------------

                 Key: LANG-574
                 URL: https://issues.apache.org/jira/browse/LANG-574
             Project: Commons Lang
          Issue Type: Improvement
          Components: lang.builder.*
    Affects Versions: 2.4
         Environment: Sun JDK 1.6.0_17
            Reporter: Anthony Whitford
            Priority: Minor


See:  
http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang3/builder/HashCodeBuilder.java?view=markup

If you use *reflectionHashCode*, you will eventually call 
*reflectionAppend(Object)* for every field (see lines 859 to 890).  There is a 
long list of _instanceOf_ checks for the various types of arrays.  My concern 
is that having an array field is relatively rare, yet the code does 9 if/else 
checks before computing the _hashCode_ for _one_ element.  I am thinking that 
it would make a lot of sense to wrap those if/else checks for the various array 
types in an *isArray* check (see Class.isArray).

If you look at the JDK source code for *Arrays.deepToString*, you will see that 
it checks if the class is an array before checking the various types.  Note 
that since it gets the Class, it doesn't need to execute _instanceOf_ which is 
likely more expensive...

I have not done profiling, but I would not be surprised if short circuiting 
these checks could improve performance by an order of magnitude.  The 
assumption is that getting the Class of an Object and asking it if it is an 
array is cheaper than asking _instanceOf_ 9 times.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to