I'm trying to run signal-based audio programs, and I'm finding that DrR is 
using well over 10x the time to perform the same GC's as command-line racket. 
Let me be more specific: I'm running a program that does a little filtering to 
combine a couple of oscillators, using big-bang. Running this program in DrR, I 
see GC logs that look like this:

GC: 0:min @ 711,798K(+89,158K)[+46,912K]; free 32,654K(-32,654K) 66ms @ 2058318
GC: 0:min @ 712,070K(+88,886K)[+46,912K]; free 32,667K(-32,667K) 69ms @ 2059160
GC: 0:min @ 712,421K(+88,534K)[+46,916K]; free 32,724K(-32,724K) 71ms @ 2059963
GC: 0:min @ 712,621K(+88,334K)[+46,916K]; free 32,698K(-32,698K) 68ms @ 2060857
GC: 0:min @ 713,411K(+87,545K)[+46,916K]; free 33,103K(-33,103K) 80ms @ 2061605
GC: 0:min @ 713,424K(+87,532K)[+46,916K]; free 32,815K(-32,815K) 78ms @ 2062341
GC: 0:min @ 714,273K(+86,683K)[+46,916K]; free 33,363K(-33,363K) 75ms @ 2062872
GC: 0:min @ 715,799K(+85,157K)[+46,916K]; free 30,988K(-30,988K) 104ms @ 2063857
…

These GCs are happening about 17 times in every 30 seconds; given the amount 
freed, this suggests that I'm generating about 18 Megabytes of trash per 
second, which seems like a lot until you divide by the sample rate of 44.1KHz, 
when it comes out to be 419 bytes of trash per sample generated, which seems 
like it's in the right ballpark.

I tried running the same program on the command-line, with "racket -W debug 
./interesting-tones.rkt", and the GC traces looked like this:

GC: 0:min @ 124,249K(+26,774K)[+11,396K]; free 32,735K(-32,735K) 5ms @ 14101
GC: 0:min @ 124,282K(+26,741K)[+11,396K]; free 32,737K(-32,737K) 5ms @ 14563
GC: 0:min @ 124,341K(+26,682K)[+11,396K]; free 32,762K(-32,762K) 5ms @ 15032
GC: 0:min @ 124,340K(+26,683K)[+11,396K]; free 32,724K(-49,108K) 7ms @ 15506
GC: 0:min @ 124,383K(+43,024K)[+11,396K]; free 32,733K(-32,733K) 6ms @ 15967
GC: 0:min @ 124,402K(+43,005K)[+11,396K]; free 32,708K(-32,708K) 6ms @ 16419
GC: 0:min @ 124,461K(+42,946K)[+11,396K]; free 32,736K(-32,736K) 5ms @ 16864
GC: 0:min @ 124,513K(+42,894K)[+11,396K]; free 32,743K(-32,743K) 10ms @ 17312
GC: 0:min @ 124,563K(+42,844K)[+11,396K]; free 32,764K(-32,764K) 5ms @ 17767
GC: 0:min @ 124,566K(+42,841K)[+11,396K]; free 32,739K(-32,739K) 6ms @ 18227
GC: 0:min @ 124,595K(+42,812K)[+11,396K]; free 32,733K(-32,733K) 5ms @ 18681
GC: 0:min @ 124,628K(+42,779K)[+11,440K]; free 32,673K(-32,673K) 9ms @ 19161
….

Note that it's collecting about the same amount of trash each time (about 
32Meg), but the gc pauses are only 5-10 ms, rather than 60-100. This means no 
audible pauses, and it sounds quite nice, rather than extremely hiccupy.

I see that DrR's heap is much bigger: 713Meg vs 125Meg. Would this account for 
the much longer GC times? I'm imagining that these are minor collections, that 
don't affect much outside of the nursery (and I guess I'm assuming we have a 
generational collector), so it seems like the bulky background shouldn't affect 
the GC times, at least not by a factor of 10.  Is there something else going on?

John


P.S.: I should admit that I think I could address this problem in DrR by 
turning the buffer size up to, say, 200ms, but that's a really slow response 
rate; if you're trying to play a keyboard, for instance, 200ms feels quite 
sluggish.

P.P.S.: this version of DrR hasn't been updated in a month… I suppose I should 
update, and perhaps something magical will happen :).

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_________________________
  Racket Developers list:
  http://lists.racket-lang.org/dev

Reply via email to