(packrat)を用いて記述されている。(packrat)はBNFに近い形でパーサが記述できるという点においてはよくできているのだが、性能という点ではあまり(かなり)よろしくない。特にJSON程度の文法であれば、専用のパーサを書くのもそんなに面倒ではないのだが、いかんせん自分があまりタイトに使わないのでとりあえず気にしないでいた。 っで、以下のツイートと性能評価までしていただいた記事が昨日(だったかな?)でてきた。
Sagittarius 全体のライセンスは MIT なので、 GPL なライブラリで置換えることは期待できず、別途ライブラリとしてまとめるしかない。
でも JSON はよく使うしなぁ。 可能なものなら処理系の公式な (同梱されている) ライブラリが速いほうがいいよなぁ。
— 齊藤敦志@讃岐うどん殺しの王(公式) (@SaitoAtsushi) January 26, 2015
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 sys25倍程度の高速化になったみたいである。まぁ、これくらい高速になるのであれば置き換えてもいいかな。
No comments:
Post a Comment