[s-xml-rpc-devel] significant speed increase in SBCL
Sven Van Caekenberghe
scaekenberghe at common-lisp.net
Sun Feb 17 13:15:23 UTC 2008
Will,
On 17 Feb 2008, at 02:35, William Halliburton wrote:
> Hello all. Using s-xml-rpc with SBCL 1.0.14 and was seeing a lot of
> consing.
> Just attempted to hit some low hanging fruit and got lucky.
>
> Please excuse any wierd table cut-and-paste formatting below.
>
> I am using hunchentoot as the front end and was calling as such:
>
> (handle-xml-rpc-call (raw-post-data :want-stream t) id)
>
> Profiling gave: (note that the lisp test system was calling itself
> so both the call and answer are shown,
> but I really only care about the answer.)
>
> ;; seconds | consed | calls | sec/call | name
> ;; ----------------------------------------------------------
> ;; 10.430 | 107,109,496 | 32 | 0.325942 | S-XML-RPC:XML-
> RPC-CALL
> ;; 5.583 | 57,897,032 | 1,670 | 0.003343 | S-XML::PARSE-
> IDENTIFIER
> ;; 1.179 | 12,740,176 | 835 | 0.001412 | S-XML::PARSE-XML-
> ELEMENT
> ;; 1.073 | 9,625,512 | 1,845 | 0.000582 | S-XML::PARSE-
> WHITESPACE
> ;; 0.988 | 8,591,704 | 239 | 0.004132 | S-XML::PARSE-TEXT
> ;; 0.425 | 4,491,216 | 899 | 0.000472 | S-XML::SKIP-
> WHITESPACE
> ;; 0.111 | 53,968 | 1,670 | 0.000067 | S-XML:RESOLVE-
> IDENTIFIER
> ;; 0.041 | 0 | 11,810 | 0.000003 | S-
> XML::IDENTIFIER-CHAR-P
> ;; 0.028 | 516,088 | 64 | 0.000436 | S-XML-
> RPC::FORMAT-HEADER
> ;; 0.021 | 720 | 1,670 | 0.000013 | S-XML::FIND-
> NAMESPACE-BINDING
> ;; 0.021 | 0 | 1,845 | 0.000011 | S-XML::GET-BUFFER
> ;; 0.013 | 0 | 1,670 | 0.000008 | S-XML:SPLIT-
> IDENTIFIER
> ;; 0.011 | 0 | 835 | 0.000013 | S-XML-
> RPC::DECODE-XML-RPC-FINISH-ELEMENT
>
>
> When I changed handle-xml-rpc-call to take a string as make its own
> stream as such:
>
> (handle-xml-rpc-call-string (raw-post-data) id)
>
>
> (defun handle-xml-rpc-call-string (string id)
> (with-input-from-string (in string)
> (let ((call (decode-xml-rpc in)))
> (let ((result (apply *xml-rpc-call-hook*
> (first call)
> (rest call))))
> (encode-xml-rpc-result result))))))
>
> I now profile:
>
> seconds | consed | calls | sec/call | name
> ---------------------------------------------------------
> 0.985 | 15,135,160 | 32 | 0.030786 | S-XML-RPC:XML-RPC-CALL
> 0.023 | 118,296 | 1,670 | 0.000014 | S-XML:RESOLVE-
> IDENTIFIER
> 0.021 | 0 | 11,810 | 0.000002 | S-XML::IDENTIFIER-
> CHAR-P
> 0.019 | 769,856 | 32 | 0.000593 | RPC-HANDLER
> 0.016 | 459,688 | 64 | 0.000248 | S-XML-RPC::FORMAT-
> HEADER
> 0.013 | 11,128 | 899 | 0.000014 | S-XML::SKIP-WHITESPACE
> 0.010 | 12,536 | 1,670 | 0.000006 | S-XML::PARSE-
> IDENTIFIER
> 0.009 | 0 | 1,670 | 0.000006 | S-XML::GET-MINI-BUFFER
> 0.009 | 0 | 1,670 | 0.000006 | S-XML:SPLIT-IDENTIFIER
> 0.004 | 0 | 8 | 0.000498 | UPDATE-SEARCH-STRING
> 0.004 | 7,944 | 32 | 0.000118 | S-XML-RPC::ENCODE-
> XML-RPC-RESULT
>
> For a 10 fold speed increase.
>
> I just thought this might be of use to someone down the line.
>
> Will
Thanks for trying to optimize s-xml-rpc, a 10-fold speed-increase
would be nice indeed.
However, could you please specify your change/patch against the latest
version of xml-rpc.lisp version 1.11 from cvs head ? That function is
considerably larger. But the key point of your change would be the
same. Having said that, I feel that the speed increase and/or orginal
slowness has something to do with the differences between (raw-post-
data :want-stream t) and (raw-post-data) rather than with the s-xml-
rpc code. The stream delivered by hunchentoot is either slow or slow
as used by the xml parser (char by char). This is some kind of network
stream so maybe there is some logic to this.
Anyway, you could use
(with-input-from-string (in (raw-post-data))
(handle-xml-rpc-call-string in id))
to get your optimization and without touching the original code.
Still, the tip of consuming the post data all at once and then feeding
it to s-xml-rpc as a string-stream still stands.
What do you think ?
Sven
More information about the S-xml-rpc-devel
mailing list