[Haskell-cafe] Fast JSON validation - reducing allocations

Ben Gamari ben at smart-cactus.org
Thu May 11 19:32:41 UTC 2017

David Turner <dave.c.turner at gmail.com> writes:

> Ben, Eric, thanks for your help. A whole new world of low-level statistics
> opens up before me...
No worries!

> You're not wrong.
> I've trawled through the STG as best as I can for a newbie. The function
> with a large number in the 'Alloc' column looks pretty much to be the heart
> of the `step` function. There's a lot of nesting but it looks largely to be
> just checking the bounds on array indices, which I don't think allocates
> anything.
Something that I should have mentioned earlier is that STG has the nice
property that all allocation is syntactically obvious: allocated
closures manifest as `let`s. This makes it fairly easy to pick out
possible allocation sites, even in large dumps.

> However I see this this little snippet at the very bottom of the nesting:
> case
>     indexArray# [ds1_sl1b
>                  y2_sl5H]
> of
> _ [Occ=Dead]
> { (##) ipv8_sl60 [Occ=Once!] ->
>       case
>           ipv8_sl60
>       of
>       _ [Occ=Dead]
>       { GHC.Word.W8# dt6_sl62 [Occ=Once] ->
>             case
>                 ss_sl5v
>             of
>             dt7_sl63
>             { __DEFAULT ->
>                   (#,,#) [__word 1
>                           dt6_sl62
>                           dt7_sl63];
>             };
>       };
> };
> I'm guessing that the `indexArray` call is the line that reads `nextState =
> aTransitionsTable makeAutomaton AU.! (currentState, nextByte)`, and to me
> it looks like it might be unboxing the thing it's getting out of the array.
> Not sure that counts as an allocation, but I'm surprised anyway.
The unboxing should just involve looking at the value field of the W8#
closure (e.g. a memory dereference) and putting the value in a machine
register. There is no allocation here as far as I can see.

> I'll keep digging anyway, but it'd be good to hear of any progress at your
> end too. Hope it didn't spoil your lunch!

Far from it! It was nice to have a puzzle to ponder.


- Ben
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 487 bytes
Desc: not available
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20170511/abf07018/attachment.sig>

More information about the Haskell-Cafe mailing list