[web-devel] Issues with aeson encoding performance
Chris Smith
cdsmith at gmail.com
Mon Aug 29 17:08:41 CEST 2011
I know a lot of you use aeson for JSON encoding, and I get the feeling
I'm doing something wrong here, so if you can give me some kind of a
hint, I'd appreciate it.
The aeson package description talks about getting up to around 40K
messages per second from the encoding, but I'm pegging the CPU at 100%
just trying to send 10 messages per second. Profiling (which is a REAL
pain to reproduce, since the GHC API is involved... but I locally
butchered a copy of the code enough to route around that) shows JSON
serialization taking 98% of the CPU and doing 99.8% of allocations (on
the order of 5 GB of total allocation if I leave it running for 15
seconds). Heap profiling also shows the vast majority of the heap
occupied by aeson's types (Value, Number, etc), and with huge spikes.
The streaming code -- very straightforward; it just repeatedly does a
toJSON (getValue (f t)) at most once every 0.1 seconds -- is at
https://github.com/cdsmith/gloss-web/blob/master/src/Main.hs#L188
and the serialization (of Gloss's Picture data type) is at
https://github.com/cdsmith/gloss-web/blob/master/src/Instances.hs#L106
The code to build the Picture data type is the "animation" function in
the second example at:
http://cdsmith.wordpress.com/2011/08/20/animations-added-to-web-based-haskell-gloss/
Any ideas? I'm about to try rewriting the JSON serialization to avoid
aeson, but before I go there, I thought I'd ask if anyone sees something
obviously wrong here.
--
Chris Smith
More information about the web-devel
mailing list