unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Julian Scheid <julians37@gmail.com>
To: emacs-devel@gnu.org
Subject: Fast JSON codec based on YAJL
Date: Tue, 15 Jan 2013 01:36:04 +0100	[thread overview]
Message-ID: <m2hamj8eq3.fsf@gmail.com> (raw)

Hi,

I'm getting close to finishing a first version of an interface to YAJL,
"a small event-driven (SAX-style) JSON parser written in ANSI C, and a
small validating JSON generator."  See http://lloyd.github.com/yajl/

I've started working on this interface because json.el proves to be a
bottleneck in another project of mine.

A few unscientific benchmarks suggest that YAJL (via my interface) is
roughly 5 to 25 times as fast as byte-compiled json.el, on average about
an order of magnitude faster.  Memory usage is about on par.

With a few minor exceptions it's fully compatible to json.el and can be
used as a drop-in replacement in most situations. [*]

The interface also exposes a number of useful YAJL features not found in
json.el, such as optional pretty-printing.

It comes with a comprehensive ERT-based unit test suite, a small
stress-test and benchmarking suite, full TexInfo documentation, and the
usual detection code and switches for the configure script.

I've looked at a number of JSON libraries and chose YAJL mainly because
it's mature, clean and fast, and its event-driven architecture means a
redundant document tree won't have to be kept in memory.

YAJL is available in most major package repositories such as Debian, Red
Hat, Arch Linux, and MacPorts.

Is there interest in adding this interface to Emacs mainline?  If so,
I'd polish it a bit more and send over my code for review soon.

As for the legal side, YAJL (the underlying library, not my interface)
uses the ISC license but is only linked against.  The interface itself
doesn't include any ISC-licensed code, or any third-party code for that
matter.  I'd be happy to sign over copyright.

Julian


[*] The minor incompatibilities boil down to the fact that json.el can
emit invalid JSON in some cases when YAJL refuses to do so.  Example:
(json-encode '((1 . 1))) will yield invalid JSON output.  json.el also
has issues with characters on the astral plane and some to do with NaN
and Inf, which YAJL handles slightly different (and closer to the JSON
specification.)



             reply	other threads:[~2013-01-15  0:36 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-15  0:36 Julian Scheid [this message]
2013-01-15  2:26 ` Fast JSON codec based on YAJL Stefan Monnier
2013-01-15  3:04   ` Julian Scheid

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m2hamj8eq3.fsf@gmail.com \
    --to=julians37@gmail.com \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).