On Sep 15, 2011, at 8:04 AM, Ross Peoples wrote:
> The way it is now, the JSON runs first, then the XML. I never interleaved the
> two because I wanted to keep it simple. I can make the XML run first instead
> and do another test:
>
> FINAL RESULTS
> ==================================
> JSON-RPC Average Time: 59.91 ms
> JSON-RPC Total Time Taken: 10007.80 ms
> XML-RPC Average Time: 21.84 ms
> XML-RPC Total Time Taken: 6201.04 ms
> Result: XML won by: 38.07 ms (274.3% faster)
>
> No change when I made XML run first, before JSON.
Thanks for the summary, Ross. Comments below.
>
>
> SUMMARY OF THREE ISSUES
> ========================
>
> 1. Auth and JSON-RPC
> -------------------------------------
>
> This problem stems from enabling Auth:
>
> auth = Auth(db)
> auth.define_tables()
>
> Whenever Auth is enabled, the average time per request for XML-RPC and
> JSON-RPC are about 45 ms and 65 ms, respectively. However, whenever Auth is
> not enabled, these times change dramatically, but only for XML-RPC. The
> average time per request for XML-RPC and JSON-RPC is now about 20 ms and 60
> ms, respectively. The time it takes for JSON-RPC requests to run drops about
> 5 ms per request, however, the time XML-RPC requests drops by 25 ms (more
> than half).
Am I correct that pretty much the same thing happens if you turn off the
define_tables call?
A side note: one table (signatures) gets defined in the Auth() call regardless.
I didn't see anything else in Auth.__init__ that could account for much time.
The HMAC key logic by default reads a file from the file system, but presumably
that's thoroughly cached by the OS.
It's not so surprising that bypassing the Auth logic speeds things up a bit,
though 25ms seems a bit high for what it's doing. But I can't see any
explanation for a differential effect between JSON and XML.
>
> 2. Unicode and JSON-RPC
> ---------------------------------------
>
> As for the unicode issue, I noticed this as well. I also tried going back to
> simplejsonrpc, but that also returns strings as unicode. Are unicode strings
> a requirement of the JSON-RPC protocol?
I don't actually see a problem with this. In contrib.simplejsonrpc we specify a
charset of utf8 on the content-type header. Just for idle curiosity you could
try that and get rid of the charset specifier and see if that's the trigger.
But we actually want that.
What I don't understand is why local strings like web2py_path are unicode under
JSON but not under XML.
>
>
> 3. SSL and web2py's simplejsonrpc
> ----------------------------------------------------
>
> Finally, on a note about web2py's simplejsonrpc implementation, it runs much
> slower over SSL, possibly because it makes a new connection for each request,
> whereas jsonrpclib and xmlrpclib leave the connection open for subsequent
> requests.
Yes, that's certainly what's going on.
The other big performance hit is that 2-3 places in web2py we do this:
import contrib.simplejson as simplejson
That really needs to change to something like this (with corresponding changes
to the code)
try:
import json # try stdlib (py2.6)
except ImportError:
try:
import simplejson as json # try external module
except:
import gluon.contrib.simplejson as json # fall back on pure-Python
module
The problem is that we need to be using the optimized C libraries when we can
(that's why XML is faster, I think). But the copy in contrib is pure Python. It
works, but it's slow.