Hi,
While doing performance tests on deserialization, I noticed that Axis
scales very poorly when increasing the number of threads.
Here are the figures:
5 threads, 1000 messages: 15 seconds
10 threads, 1000 messages: 56 seconds
15 threads, 1000 messages: 93 seconds
The root of the problem is in XMLUtils. Each time a node is created via
the static fuction newDocument(...), there are two functions,
getDocumentBuilder() and realeaseDocumentBuilder(), called which both
peform synchronisation over a pool of document builders
(documentBuilders ). Since XML documents contain many nodes and there
are at least two synchronization points in the code per node created, I
let you imagine the overhead suffered when more threads come into play.
I was able to achieve a significant performance boost by replacing the
pool of DocumentBuilders (documentBuilders) by a single document builder
stored in a ThreadLocal variable. This was already suggested a while ago
in this mailing list (see "Performance Issues with AXIS & Axis Response
time appears linear with load").
The results of my benchmark with the changes brought to the code are
shown below.
5 threads, 1000 messages: 13seconds
10 threads, 1000 messages: 25,5 seconds
15 threads, 1000 messages: 37 seconds
As you can see, deserialization time scales now linearly with the number
of threads which is a lot better. I placed the code in attachment. Could
you include sth equivalent in the next release of the Axis.
Thanks,
Sebastien