テストフレームワークの下調べ

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 に関しては実行時間を半分にできれば、万々歳という感じなのかな。意外と減らせなさそうだ。