テストフレームワークの下調べ
test/record.scm の実行時間はデバッグ版の mosh で 700-800 msec 。
そこから (test-eq? ...) などを抜くと 300 msec 前後。
つまりテスト実行時間の半分以上がテストフレームワークコードの実行。
その中には
- (mosh test) のロード 10msec
- (test-eq? ...) などの展開
- (test-eq? ...) の中での eq? 比較や、結果の保持作業の時間
が含まれる。
展開のコストは以下のようなマクロを用意して (test-eq? ...) などの代わりに使ってみると分かる。
テストケースで例外が上がったときに failure とするためのコストが高い。
(define-syntax a (lambda (x) (syntax-case x () [(_ (x ...)) #'(call/cc (lambda (cont) (with-exception-handler (lambda (c) (cont #f)) (lambda () (x ...)))))])))
おおよそ、80msec。この中には call/cc の実行コストも含まれている。
guard ではなく、call/cc + with-exception-handler を使っているのは単純に速いから。guard は展開コストが高いようだ。(100msecほど余計にかかる)
eq? 比較は、上のマクロにダミーの eq?/eqv?/equal? を入れてみると分かる。数 msec と大きくない。
テスト結果の保持は set! を上のマクロに入れてみる。10-20 msec 増える。
こうやって見ていくと、test/record.scm に関しては実行時間を半分にできれば、万々歳という感じなのかな。意外と減らせなさそうだ。