racket/collects/meta/drdr/time-file.rkt
2010-11-11 15:59:50 -07:00

57 lines
1.8 KiB
Racket

#lang racket
(require "config.rkt"
"dirstruct.rkt"
"cache.rkt"
"path-utils.rkt"
"status.rkt")
(define revision #f)
(define filename
(command-line #:program "time-file"
#:once-any
["-H" "Run on all revisions"
(set! revision #f)]
["-r" rev "Run on one revision"
(set! revision (string->number rev))]
#:args (filename) filename))
(define (output-for-rev rev)
(define log
(read-cache* (build-path (revision-log-dir rev) filename)))
(when log
(printf "~S\n"
(list rev
(status-duration log)
(filter-map
(match-lambda
[(struct stdout ((regexp #px#"cpu time: (\\d+) real time: (\\d+) gc time: (\\d+)"
(list _
(app (compose string->number bytes->string/utf-8) cpu)
(app (compose string->number bytes->string/utf-8) real)
(app (compose string->number bytes->string/utf-8) gc)))))
(list cpu real gc)]
[_
#f])
(status-output-log log))))))
(define data-file (path-timing-log filename))
(with-handlers ([exn:fail? void])
(make-parent-directory data-file))
(printf "Making log for ~a\n" filename)
(if revision
(with-output-to-file
data-file
#:exists 'append
(lambda ()
(output-for-rev revision)))
(with-output-to-file
data-file
#:exists 'replace
(lambda ()
(init-revisions!)
(for ([rev (in-list revisions)])
(output-for-rev rev)))))