■
この expander なかなか優秀ではないか。Transcribe した後の symbol lookup はちょっと遅いけど、expansion そのものは Oleg Kiselyov の stress test を基準に言えば高速な部類に入るらしい。試してみた範囲では
- Guile, Gauche, Bigloo, STklos → error (bigloo はネタ元の site に載ってるのより version が新しい)
- Gambit → 正しい使い方がわからず(泣) Manual を見てやってみたけど、何か当たり障りの無い単純 macro でも文句言って評価してくれない。
- Scheme48 → 5 分 (!)
- SigScheme (1 object = 4 word, assert 有効) → 4.9 〜 6.2 秒
- SigScheme (1 object = 4 word, NDEBUG) → 0.8 〜 1.1 秒
- Petite Chez → 0.7 〜 1.0 秒
時間は real time だけど、どの場合も sys の寄与は誤差程度。この stress test は match pattern が小さくて template が大きく、ellipsis が使われていません。よって時間の大半は多分 transcription に費されてます (instrument してないけど)。しかし、走らせる毎に遅くなっていくのは何故?
まあそれはいいとして、この結果を見て Shiro さんに忠告。Scheme48 が 400 倍近く時間かかってるのは多分 expander が scheme で書かれてるからです。Gauche の expander を Scheme で書き直すという事ですが、かなり cost conscious な coding を覚悟しないと、高くつくかもしれませんよ。あるいはカリカリに tune した bytecode / C code を吐く compiler を用意するとか。
それにしても、やるなあ Chez。Compact したらもっと引き離されるし。
;; とは言っても何箇所か code size と robustness を優先して書いた部分もあるので、
;; speed に向けて tune したらもうちょっと詰められるのかも知れない。