Performance of std.json
Masahiro Nakagawa via Digitalmars-d
digitalmars-d at puremagic.com
Tue Jun 3 04:25:17 PDT 2014
On Monday, 2 June 2014 at 00:18:19 UTC, David Soria Parra wrote:
> Hi,
>
> I have recently had to deal with large amounts of JSON data in
> D. While doing that I've found that std.json is remarkable slow
> in comparison to other languages standard json implementation.
> I've create a small and simple benchmark parsing a local copy
> of a github API call
> "https://api.github.com/repos/D-Programming-Language/dmd/pulls"
> and parsing it 100% times and writing the title to stdout.
>
> My results as follows:
> ./d-test > /dev/null 3.54s user 0.02s system 99% cpu 3.560
> total
> ./hs-test > /dev/null 0.02s user 0.00s system 93% cpu 0.023
> total
> python test.py > /dev/null 0.77s user 0.02s system 99% cpu
> 0.792 total
>
> The concrete implementations (sorry for my terrible haskell
> implementation) can be found here:
>
> https://github.com/dsp/D-Json-Tests/
>
> This is comapring D's std.json vs Haskells Data.Aeson and
> python standard library json. I am a bit concerned with the
> current state of our JSON parser given that a lot of
> applications these day use JSON. I personally consider a high
> speed implementation of JSON a critical part of a standard
> library.
>
> Would it make sense to start thinking about using ujson4c as an
> external library, or maybe come up with a better
> implementation. I know Orvid has something and might add some
> analysis as to why std.json is slow. Any ideas or pointers as
> to how to start with that?
I don't know the status of another D based JSON library.
If you can install yajl library, then yajl-d is an another
candidate.
% time ./yajl_test > /dev/null
./yajl_test > /dev/null 0.42s user 0.01s system 99% cpu 0.434
total
% time python test.py> /dev/null
python test.py > /dev/null 0.65s user 0.02s system 99% cpu 0.671
total
% time ./test > /dev/null
./test > /dev/null 3.10s user 0.02s system 99% cpu 3.125 total
import yajl.yajl, std.datetime, std.file, std.stdio;
void parse() {
foreach(elem; readText("test.json").decode.array) {
writeln(elem.object["title"]);
}
}
int main(string[] args) {
for(uint i = 0; i < 100; i++) {
parse();
}
return 0;
}
http://code.dlang.org/packages/yajl
NOTE: yajl-d doesn't expose yajl's SAX style API unlike Sean's
implementation
More information about the Digitalmars-d
mailing list