Move get-times to utils.rkt, to use it from the contract profiler.
original commit: a3f4e45026338d3fe6b140cba65178af9a3ba2d5
This commit is contained in:
parent
620ebd0c32
commit
eb10f2bf71
|
@ -120,54 +120,6 @@
|
||||||
(check-equal? (split-by-thread '([0 x1] [1 y1] [0 x2] [2 z1] [0 x3] [2 z2]))
|
(check-equal? (split-by-thread '([0 x1] [1 y1] [0 x2] [2 z1] [0 x3] [2 z2]))
|
||||||
'#([(x3) (x2) (x1)] [(y1)] [(z2) (z1)])))
|
'#([(x3) (x2) (x1)] [(y1)] [(z2) (z1)])))
|
||||||
|
|
||||||
;; gets a list of thread-id and data for that thread beginning with the
|
|
||||||
;; millisecond count, and returns a similar list where the samples begin with
|
|
||||||
;; the time spent for that sample. The time spent is taken as half of the two
|
|
||||||
;; touching ranges; for example, if there are three samples showing snapshot
|
|
||||||
;; times of 10, 20, 60, then the middle one is assumed to have a time of 25.
|
|
||||||
;; For the first and last samples, the time is twice the half of the single
|
|
||||||
;; touching range -- with this example, this would be 10 for the first and 40
|
|
||||||
;; for the last. If there is a thread with just one sample, it is dropped.
|
|
||||||
(define (get-times samples)
|
|
||||||
(cond
|
|
||||||
;; nothing to do
|
|
||||||
[(null? samples) '()]
|
|
||||||
;; throw out a single sample
|
|
||||||
[(null? (cdr samples)) '()]
|
|
||||||
[else (let loop ([samples samples]
|
|
||||||
[prevs (cons #f (map car samples))]
|
|
||||||
[r '()])
|
|
||||||
(if (null? samples)
|
|
||||||
(reverse r)
|
|
||||||
(let* ([prev (car prevs)]
|
|
||||||
[cur (caar samples)]
|
|
||||||
[data (cdar samples)]
|
|
||||||
[prevs (cdr prevs)]
|
|
||||||
[samples (cdr samples)]
|
|
||||||
[next (and (pair? samples) (caar samples))])
|
|
||||||
(loop samples prevs
|
|
||||||
(cons (cons (if next
|
|
||||||
;; not the last: there must be a next
|
|
||||||
(if prev (/ (- next prev) 2) (- next cur))
|
|
||||||
;; last one: there must be a prev
|
|
||||||
(- cur prev))
|
|
||||||
data)
|
|
||||||
r)))))]))
|
|
||||||
|
|
||||||
(module+ test
|
|
||||||
(check-equal? (get-times '())
|
|
||||||
'())
|
|
||||||
(check-equal? (get-times '([10 a]))
|
|
||||||
'())
|
|
||||||
(check-equal? (get-times '([10 a] [20 b]))
|
|
||||||
'([10 a] [10 b]))
|
|
||||||
(check-equal? (get-times '([10 a] [20 b] [60 c]))
|
|
||||||
'([10 a] [25 b] [40 c]))
|
|
||||||
(check-equal? (get-times '([10 a] [20 b] [30 c] [40 d]))
|
|
||||||
'([10 a] [10 b] [10 c] [10 d]))
|
|
||||||
(check-equal? (get-times '([10 a] [20 b] [60 c] [80 d]))
|
|
||||||
'([10 a] [25 b] [30 c] [20 d])))
|
|
||||||
|
|
||||||
;; returns a list of (cons item occurrences) for the items in l
|
;; returns a list of (cons item occurrences) for the items in l
|
||||||
(define (get-counts l)
|
(define (get-counts l)
|
||||||
(let loop ([l l] [r '()])
|
(let loop ([l l] [r '()])
|
||||||
|
|
|
@ -171,3 +171,53 @@
|
||||||
;; can be there with another node, eg (* -> A 2-> B 3-> A)), but be safe and
|
;; can be there with another node, eg (* -> A 2-> B 3-> A)), but be safe and
|
||||||
;; look for any empty layer
|
;; look for any empty layer
|
||||||
(filter pair? (vector->list layers)))
|
(filter pair? (vector->list layers)))
|
||||||
|
|
||||||
|
;; gets a list of thread-id and data for that thread beginning with the
|
||||||
|
;; millisecond count, and returns a similar list where the samples begin with
|
||||||
|
;; the time spent for that sample. The time spent is taken as half of the two
|
||||||
|
;; touching ranges; for example, if there are three samples showing snapshot
|
||||||
|
;; times of 10, 20, 60, then the middle one is assumed to have a time of 25.
|
||||||
|
;; For the first and last samples, the time is twice the half of the single
|
||||||
|
;; touching range -- with this example, this would be 10 for the first and 40
|
||||||
|
;; for the last. If there is a thread with just one sample, it is dropped.
|
||||||
|
(provide get-times)
|
||||||
|
(define (get-times samples)
|
||||||
|
(cond
|
||||||
|
;; nothing to do
|
||||||
|
[(null? samples) '()]
|
||||||
|
;; throw out a single sample
|
||||||
|
[(null? (cdr samples)) '()]
|
||||||
|
[else (let loop ([samples samples]
|
||||||
|
[prevs (cons #f (map car samples))]
|
||||||
|
[r '()])
|
||||||
|
(if (null? samples)
|
||||||
|
(reverse r)
|
||||||
|
(let* ([prev (car prevs)]
|
||||||
|
[cur (caar samples)]
|
||||||
|
[data (cdar samples)]
|
||||||
|
[prevs (cdr prevs)]
|
||||||
|
[samples (cdr samples)]
|
||||||
|
[next (and (pair? samples) (caar samples))])
|
||||||
|
(loop samples prevs
|
||||||
|
(cons (cons (if next
|
||||||
|
;; not the last: there must be a next
|
||||||
|
(if prev (/ (- next prev) 2) (- next cur))
|
||||||
|
;; last one: there must be a prev
|
||||||
|
(- cur prev))
|
||||||
|
data)
|
||||||
|
r)))))]))
|
||||||
|
|
||||||
|
(module+ test
|
||||||
|
(require rackunit)
|
||||||
|
(check-equal? (get-times '())
|
||||||
|
'())
|
||||||
|
(check-equal? (get-times '([10 a]))
|
||||||
|
'())
|
||||||
|
(check-equal? (get-times '([10 a] [20 b]))
|
||||||
|
'([10 a] [10 b]))
|
||||||
|
(check-equal? (get-times '([10 a] [20 b] [60 c]))
|
||||||
|
'([10 a] [25 b] [40 c]))
|
||||||
|
(check-equal? (get-times '([10 a] [20 b] [30 c] [40 d]))
|
||||||
|
'([10 a] [10 b] [10 c] [10 d]))
|
||||||
|
(check-equal? (get-times '([10 a] [20 b] [60 c] [80 d]))
|
||||||
|
'([10 a] [25 b] [30 c] [20 d])))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user