Let's start Scheme

2015-01-26

JSONパーサの性能改善

現状ではJSONパーサは(packrat)を用いて記述されている。(packrat)はBNFに近い形でパーサが記述できるという点においてはよくできているのだが、性能という点ではあまり(かなり)よろしくない。特にJSON程度の文法であれば、専用のパーサを書くのもそんなに面倒ではないのだが、いかんせん自分があまりタイトに使わないのでとりあえず気にしないでいた。

っで、以下のツイートと性能評価までしていただいた記事が昨日(だったかな?)でてきた。




JSON パーサの性能評価 - 主題のない日記

Guile用のライブラリをR6RS修正したものとの比較で30倍程度の差があるようである。 まぁ、性能に関して遅い方がいいなどという要件は見たことがないので、ここはえいやっとやってしまおうということにした。

せっかく書き直すのだから、後で多少色を付けやすいように(text json)というライブラリを作り、(json)はそれを使用するという形にすることにした。まぁ、実装はゴリゴリと地道にパーサを書くだけなので省略。

っで、ベンチを取る。上記の記事で使用したデータは非公開のようなので、Twitterから適当にJSONデータを取得。(Sagittarius-net-twitterを使用した。これももう少しTwitter API v1.1に対応しないとなぁ・・・) 25KBと多少小さめだがまぁいいだろう。ベンチマークには以下のスクリプトを使用。
(import (rnrs) 
 (prefix (text json) new:)
 (prefix (json) old:)
 (time))

(define (run-bench json-read)
  (call-with-input-file "bench.json"
    (lambda (in)
      (time (json-read in)))))

(run-bench old:json-read)
(run-bench new:json-read)
以下が結果:
;;  (json-read in)
;;  0.815046 real    1.310000 user    0.000000 sys

;;  (json-read in)
;;  0.032002 real    0.031000 user    0.000000 sys
25倍程度の高速化になったみたいである。まぁ、これくらい高速になるのであれば置き換えてもいいかな。

No comments:

Post a Comment