You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by bu...@apache.org on 2003/06/12 20:55:17 UTC

DO NOT REPLY [Bug 20719] New: - BeanPropertyDescriptor cpu consuming on large arrays

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20719>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20719

BeanPropertyDescriptor cpu consuming on large arrays

           Summary: BeanPropertyDescriptor cpu consuming on large arrays
           Product: Axis
           Version: 1.1rc2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: Blocker
          Priority: Other
         Component: Serialization/Deserialization
        AssignedTo: axis-dev@ws.apache.org
        ReportedBy: nisol.fabien@hydro.qc.ca


We were faced to a BIG performance problem using Document encoding.

We have a xsl definition like the following:

    <xsd:complexType name="PointIdList">
        <xsd:sequence> 
            <xsd:element name="id" type="xsd:string" minOccurs="0"
maxOccurs="unbounded" /> 
        </xsd:sequence>
    </xsd:complexType> 

We generated code using wsdl2java, and use it in our interface implementation
BUT we were faced to a big performance problem.

There are a lot of "ids" in our requests (9500+) ... 

After investigation with a profiler, we determined that the
PointIdList.setId(int idx, String value) method was called million times....

after having reduced data to 10 elements, it was 56 times ... 1+2+3+4+...+10 ... 

hmmmmmmm

A little new Exception().printStackTrace() into the setId(..,..) method showed
that it was the BeanPropertyDescriptor.growArrayToSize(Object obj, Class
componentType, int i) method that was calling this method way too much.


here's the problem:

each time a new element is added to the PointIdList object, the array must be
resized. The growArrayToSize(...) method does it by creating a new Array with
the old size +1, and then copying data from old array to the new in a loop using 
the set(Object, int, Object) method ... It is way too much cpu consuming , and I
think a bad idea (the PointIdList object does not want to know its array is
resized, it only want to know a new element is added)