minimart-benchmark-2017/measure-hash.rkt

59 lines
1.8 KiB
Racket

#lang racket
(require logbook)
(define E (standard-logbook-entry (default-logbook #:verbose? #t) "minimart" "hash-size"))
(define Ttime (logbook-table E "timing"
#:column-spec '(initial-count
wallclock-secs/entry
entries/wallclock-sec
cpu+gc-sec
wallclock-sec
gc-sec
final-count)))
(define T (logbook-table E "measurements"
#:column-spec '(number-of-entries
bytes-per-entry
current-memory-use)))
(define *the-hash* (hash))
(define *zero-datapoint* #f)
(define (record-datapoint!)
(collect-garbage)
(collect-garbage)
(collect-garbage)
(define latest-datapoint (current-memory-use))
(define n (hash-count *the-hash*))
(when (not *zero-datapoint*) (set! *zero-datapoint* latest-datapoint))
(define delta (- latest-datapoint *zero-datapoint*))
(define perentry (/ delta (exact->inexact n)))
(write-logbook-datum! T (list n perentry latest-datapoint)))
(record-datapoint!)
(let loop ((next-count 1000))
(when (< next-count 5000000)
(define old-count (hash-count *the-hash*))
(define-values (ignorable-results cpu+gc-time wallclock-time gc-time)
(time-apply
(lambda ()
(let inner-loop ((n old-count))
(when (< n next-count)
(set! *the-hash* (hash-set *the-hash* n n))
(inner-loop (+ n 1)))))
'()))
(define cpu+gc-sec (/ cpu+gc-time 1000.0))
(define wallclock-sec (/ wallclock-time 1000.0))
(define gc-sec (/ gc-time 1000.0))
(write-logbook-datum! Ttime (list old-count
(/ wallclock-sec (- next-count old-count))
(and (positive? wallclock-sec)
(/ (- next-count old-count) wallclock-sec))
cpu+gc-sec
wallclock-sec
gc-sec
next-count))
(record-datapoint!)
(loop (inexact->exact (truncate (* next-count 1.2))))))