On Fri, Jan 20, 2012 at 5:58 PM, Danny Yoo <d...@cs.wpi.edu> wrote:
> For the upcoming version of WeScheme, I'm planning to use the real
> 'compile' from Racket.  I'm trying to better understand a part of the
> compilation system.  Here's a sample program I'm using to play:
>
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> #lang racket/base
>
> (define ns (make-base-namespace))
> (define (do-compilation program)
>  (parameterize ([current-namespace ns]
>                 [read-accept-reader #t])
>    (define bytes (compile (read-syntax #f (open-input-string program))))
>    (define op (open-output-bytes))
>    (write bytes op)
>    (get-output-bytes op)))
>
> (define (do-compilation/fresh program)
>  (parameterize ([current-namespace (make-base-namespace)]
>                 [read-accept-reader #t])
>    (define bytes (compile (read-syntax #f (open-input-string program))))
>    (define op (open-output-bytes))
>    (write bytes op)
>    (get-output-bytes op)))
>
> (time
>  (for ([i 1000])
>   (void (do-compilation "#lang racket/base\n\n(printf \"Hello world\")"))))
>
> (time
>  (for ([i 1000])
>   (void (do-compilation/fresh "#lang racket/base\n\n(printf \"Hello
> world\")"))))
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>
> I see that the first do-compilation, the one that shares a namespace,
> runs faster than the version that generates fresh namespaces.
>
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> kui ~ $ racket measure-compile-time.rkt
> cpu time: 2244 real time: 2242 gc time: 172
> cpu time: 5244 real time: 6144 gc time: 516
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>
> I assume that the reason for the difference is because the first
> version touches some namespace state that's used as a part of
> compilation, so that future compilations can reuse that state.

The state there is the instantiation of racket/base I believe.

> Question: is the first version vulnerable to a memory leak?  That is,
> let's say that I enforce all programs going through do-compilation to
> be in a hardcoded set of designated #langs.  Do I run the risk of
> exhausting memory?

All of the code that runs when the top-level of a module executes will
only happen once per namespace. So I suppose the answer is "it
depends". If you really need separate instantiations of the modules,
then you cannot have just one namespace.

Hope that's useful,
Robby

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to