test/test-timing.rkt
#lang racket

(require ffi/vector
         "../rsound.rkt"
         "../private/s16vector-add.rkt"
         rackunit)

(define sr 44100)

;; 1 second of noise:
(define test-rsound
  (mono-signal->rsound sr sr
                  (lambda (t)
                    (- (* 2.0 (random)) 1.0))))

(define (gc3) 
  (collect-garbage)
  (collect-garbage)
  (collect-garbage))

(define trials 5)

(define-syntax (rtavg stx)
  (syntax-case stx ()
    [(_ e)
     #'(rtavg/helper (lambda () e))]))

(define (rtavg/helper proc)
  (readable
   (mean
    (for/list ([i (in-range trials)])
      (gc3)
      (let-values ([(dc cpu real gc) (time-apply proc '())])
        real)))))

(define (mean l)
  (/ (apply + l)
     (length l)))

(define (readable n)
  (printf "~s seconds\n" (exact->inexact (/ (round n) 1000))))

#|
;; test times appearing here gathered on my macbook air:

(define t1 (for/list ([i (in-range 1000)]) test-rsound))

;; rsound-append*...
(gc3)
(printf "rsound-append*\n0.2 sec expected, 0.0002 generation ratio\n")
(rtavg (rsound-append* t1))
(printf "\n\n")

(printf "signal->rsound of simple constant value\n")
(rtavg (mono-signal->rsound (* 100 sr) sr (lambda (t) 0.243)))
(printf "expected mean 0.8 seconds, 0.008 generation ratio\n")
(printf "could be improved substantially by caching.\n")
(printf "\n\n")
|#

#|
(printf "rsound-overlay*\n")
(printf "about 10 simultaneous streams\n")
(define quiet-noise 
  (mono-signal->rsound sr sr
                  (lambda (t)
                    (- (* 0.02 (random)) 1.0))))
(rtavg (let ([offsets (for/list ([i (in-range 100)])
                        (list quiet-noise (inexact->exact
                                           (round (* sr 10.0 (random))))))])
         (rsound-overlay* offsets)))
(printf "about 1.5 seconds, 0.15 generation ratio overall, 0.015 per streamsec\n")

(printf "result of experiments: values much faster than vectors.\n\n")

(printf "simplified rsound-overlay* test\n")
(rtavg (let ([offsets (for/list ([i (in-range 10)])
                        (list quiet-noise 0))])
         (rsound-overlay* offsets)))


|#

(printf "s16buffer-add!/c\n")
(printf "100 x 1000 frames\n")
(printf "looks like about 0.01 seconds\n")
(let ()
  (define s16vec1 (make-s16vector 1000 0))
  (define s16ptr1 (s16vector->cpointer s16vec1))
  (define s16vec2 (make-s16vector 1000 2))
  (define s16ptr2 (s16vector->cpointer s16vec2))
  (rtavg
   (for ([i (in-range 100)])
     (s16buffer-add!/c s16ptr1 s16ptr2 1000))))