SOAP performance and unmarshalling/parsing speed

I have been playing around with SOAP a little (as a client), and I
really like soap4r. I was able to get my SOAP client running without
too much trouble at all.

Unfortunately, the performance is fairly slow. We have a SOAP web
service running on the localhost, but it still takes about 4-5 seconds
to get 150K of data.

I used the wiredump to put the request/response to STDOUT, and I
realized that the actual communication is happening very fast (easily
within .5 seconds). However, it hangs for a few seconds after the
response is received, before finally returning.

I am guessing that the unmarshalling and parsing of the returned
envelope is what is taking the most time. I have heard that Ruby is not
so great at XML parsing.

Lucky for me, the return is one big chunk of text, and I just need to
strip off the envelope and don’t need any complicated parsing of the
internals.

So, finally, my question: What would be the quickest and easiest (in
terms of programming skill) of sending the SOAP call and getting the
resulting XML, but bypassing the parsing/unmarshalling? I think I can
handle the parsing by hand.

Thanks,
Micah

On 3/19/07, Micah W. [email protected] wrote:

realized that the actual communication is happening very fast (easily

Personally, I would highly recommend that you stay away from SOAP. It
has
become super bloated and just too much crap for any type of simple data
transmission “protocol”, and it’s this bloat that is causing your
slowdown.
Check out using RESTful web services (ActiveResource, for one). It’s
still
XML based communication, but it’s much, much less data getting
transfered.
(for another plus, you can get edge ActiveSupport which add
Hash#create_from_xml, doing all the parsing work for you).

As for XML in Ruby, yes it’s slow in pure Ruby. There are C plugin
parsers
around (rexml, I think), that are incredibly fast.

Jason

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

Sorry for the late response.

Micah W. wrote:

Unfortunately, the performance is fairly slow. We have a SOAP web
service running on the localhost, but it still takes about 4-5 seconds
to get 150K of data.

Can you try soap4r-1.5.6? (it’s now in RC stage and should be released
in a week). You can download RC2 from
http://dev.ctor.org/soap4r/wiki#a2007-06-05:1.5.6-RC2

For 1.5.6 last month, I did profile analysis especially on parsing large
SOAP response. It should have better performance characteristics (CPU
and memory).

And would you please send me a sample client and a sample dumped SOAP
response if it’s still slow. I’ll check where’s the bottleneck.

So, finally, my question: What would be the quickest and easiest (in
terms of programming skill) of sending the SOAP call and getting the
resulting XML, but bypassing the parsing/unmarshalling? I think I can
handle the parsing by hand.

sending:
driver.call_my_method(REXML::Document.new(“…”))

receiving:
driver.return_response_as_xml = true
xml = driver.call_my_method(…)
doc = REXML::Document.new(xml)

These require soap4r-1.5.6 RC2+.

Regards,
// NaHi

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Cygwin)

iQEVAwUBRma7NB9L2jg5EEGlAQJKhAgAnmfpoyOY5xkZQaSJY7VdOtpeqhZBB36w
Fl6hpVqciWnIwWPHTwms+LfFceS8dsREWY8QXlcljozoNHyIUSXh36gHbHUJyzBp
RnBSROipngjDG7CsjyGHZkt7hhebmpAggfEPFw66bnAHYF/Zt/CG9g4ww1ZusTdV
cvsomZPe9xn/O7/CciZOpZRHMcg2ZPOotQA58LTKpj8+mXqFn5yke3j2Zid9AiFJ
IdtbJCMf/K14ufEfcAbkQUUjVE7n6AoNJYbFx7bNxo47Rwnv7c+VPBDc8KaWK+3w
4IMn7LP181wUp5TsUGoFeiKX7GiZy9QFgytrBqVnLaTZmotS++obgg==
=x4fO
-----END PGP SIGNATURE-----