Document Performance Report.

This commit is contained in:
Vincent St-Amour 2011-07-15 12:11:10 -04:00
parent db9d51fef7
commit f632aa52dd

View File

@ -164,60 +164,25 @@ cases.
Typed Racket provides performance debugging support to help you get the Typed Racket provides performance debugging support to help you get the
most of its optimizer. most of its optimizer.
Setting the racket @seclink[#:doc '(lib The @deftech{Performance Report} DrRacket plugin can be used when editing a
"scribblings/reference/reference.scrbl") "logging"]{logging} facilities to the Typed Racket program in DrRacket. Clicking the Performance Report button
@racket['warning] level when compiling a Typed Racket program causes runs the optimizer and reports the results. All performed optimizations are
the optimizer to log each optimization it performs. Setting the Racket highlighted in green in the editor. In addition, the optimizer also reports
logging level can be done on the command line with the @racket[-W] cases where an optimization was close to happening, but was not ultimately safe
flag: to perform. These cases are highlighted in shades of red in the editor. The
redder the highlight, the higher the potential for optimization in the
highlighted region is.
Additional information can be accessed by clicking on the highlighted
regions. A summary of the performed optimizations and advice on how to adjust
code to make it more amenable to optimization is provided as appropriate, and
can as a starting point for performance debugging.
Similar information (albeit without in-depth explanations or advice) is
available from the command line. When compiling a Typed Racket program, setting
the racket @seclink[#:doc '(lib "scribblings/reference/reference.scrbl")
"logging"]{logging} facilities to the @racket['warning] level causes Typed
Racket to display performance debugging information. Setting the Racket logging
level can be done on the command line with the @racket[-W] flag:
@commandline{racket -W warning my-typed-program.rkt} @commandline{racket -W warning my-typed-program.rkt}
@(define log (open-output-string))
@(define the-eval (make-base-eval))
@(for-each the-eval
'((define sandbox-receiver
(make-log-receiver (current-logger) 'warning))
(thread
(lambda ()
(let loop ()
(printf "~a\n" (vector-ref (sync sandbox-receiver) 1))
(loop))))
(require typed/racket)))
For example, the addition in the following program can be optimized:
@(racketmod+eval #:eval the-eval typed/racket
(: add-two-floats : Float Float -> Float)
(define (add-two-floats x y) (+ x y)))
@; This is very ugly, but necessary to let the log-receiver thread
@; catch up before we ask for the sandbox's output.
@; Suggestions for better solutions welcome.
@(sleep 1)
With optimizer logging turned on, the optimization is reported:
@(commandline (get-output the-eval))
@; TODO doing this in a sandbox breaks source location
In addition, the optimizer also reports cases where an optimization was
close to happening, but was not ultimately safe to perform. Such missed
optimization warnings usually provide explanations as to why an
optimization could not be performed, pointing to changes to your
program that would make it more amenable to optimization.
For example, the multiplication below cannot be safely optimized (see
above discussion about mixing reals and floats), although it may look
like it can.
@(racketmod+eval #:eval the-eval typed/racket
(: mul-int-float : Integer Float -> Real)
(define (mul-int-float x y) (* x y)))
@; Again.
@(sleep 1)
With optimizer logging turned on, the missed optimization is reported:
@(commandline (get-output the-eval))
@; TODO sandboxing also breaks "unexpansion" for printing
@(close-eval the-eval)