I've been doing some investigations into Axis performance issues. I've
mainly been looking at RPC-encoded, since that seems to be the bulk of
the web services world (at least, outside of .NET). One thing I've
noticed is the amount of redundant information in the encoding of
multiRefs. In normal operation Axis adds the encoding information and
namespace definitions to each child element of <soapenv:Body>. By moving
these (the encoding, the encoding namespace, and the main element
namespace definition) up to the <soapenv:Body> element itself I was able
to reduce the total size of the messages (originally 10KB to 320KB) by
25-30% and cut processing time by 10-25% (with more improvement on
longer messages, and processing time measured running client and server
on the same system over local HTTP).
Turning off type information also helped reduce the message size and
improve performance considerably. The combination of turning off type
information and moving the encoding and namespaces to the <soapenv:Body>
element together cut the message size by more than 50% and processing
time by 20-50%.
Turning off server-side type information in the 1.0 release version was
easy, changing the setting in the server-config.wsdd file. On the client
side I couldn't find any easy way to do this through code generated from
WSDL, so I modified the client.Call class to just always set this
property in the MessageContext. When I tried using the 11-24 daily build
I couldn't get this to work anymore - I ended up with exceptions from
both ends when the other side turned off type information. I also had
problems with WSDL generation in the daily build, so I just went back to
using the 1.0 release for my tests. Considering the benefits you might
want to consider making untyped the default for the next release, while
giving users an easy way to turn it back on for both client and server
side code.
I implemented the move of encoding and encoding namespace to the
<soapenv:Body> element by modifying the SOAPBody outputImpl() method so
that it "reverse inherits" the encoding from the first bodyElement, if
present, then calls context.registerPrefixForURI() to define the
namespace for the encoding. This seems fairly safe, though there's
probably a cleaner way - I'll supply a diff if there's interest. The
main namespace for the elements I just set directly, since I didn't dig
around enough to see how to derive it.
Aside from that, Axis is considerably slower in working with the XML
(both input and output) than DOM or dom4j, for instance. I'm still
trying to learn the details and logic of the internal handling, but I'm
beginning to see how JAX-RPC compatibility really restricts the type of
approaches that can be used for performance enhancements. I *have* got a
few areas I want to look into in more detail, though, and should get a
chance to do that in a week or so. I'll try to submit actual code rather
than just comments and suggestions when I do!
Hope this is of interest,
- Dennis
- Re: Axis performance enhancement Dennis Sosnoski
- Re: Axis performance enhancement Davanum Srinivas