[racket] avoiding unnecessary work when using `log-debug` et al

From: Vincent St-Amour (stamourv at ccs.neu.edu)
Date: Fri Dec 12 16:49:26 EST 2014

I may be missing something, but `log-debug` and friends already do that.

    stamourv at westmount:2014-12-12 16:45:plt$ racket
    Welcome to Racket v6.1.1.6.
    -> (log-debug (begin (displayln "hello!") "log"))
    -> 
    stamourv at westmount:2014-12-12 16:45:plt$ racket -W debug
    Welcome to Racket v6.1.1.6.
    GC: 0:min @ 1,356K(+307K)[+160K]; free 932K(-5,028K) 4ms @ 12
    GC: 0:min @ 1,813K(+3,946K)[+232K]; free 755K(-2,051K) 4ms @ 20
    GC: 0:min @ 4,040K(+4,087K)[+232K]; free 1,448K(-1,448K) 4ms @ 28
    GC: 0:min @ 5,015K(+3,112K)[+240K]; free 1,425K(-6,817K) 4ms @ 40
    GC: 0:min @ 7,459K(+6,060K)[+272K]; free 2,162K(-3,458K) 0ms @ 56
    GC: 0:min @ 9,356K(+6,211K)[+280K]; free 1,628K(-2,924K) 4ms @ 72
    GC: 0:min @ 13,230K(+4,353K)[+296K]; free 2,558K(-16,142K) 12ms @ 96
    GC: 0:min @ 17,224K(+13,943K)[+392K]; free 3,900K(-6,492K) 12ms @ 136
    GC: 0:min @ 21,878K(+12,457K)[+400K]; free 4,741K(-6,037K) 12ms @ 172
    GC: 0:min @ 27,016K(+9,255K)[+988K]; free 6,168K(-8,760K) 16ms @ 232
    GC: 0:min @ 32,548K(+6,315K)[+1,276K]; free 7,665K(-26,641K) 36ms @ 312
    -> (log-debug (begin (displayln "hello!") "log"))
    hello!
    log
    ->

`log-message`, however, does not.

The problem may be that, when you switch to the lower logging level,
your old listener for the higher level is still around to receive the
messages.

Vincent



At Fri, 12 Dec 2014 13:32:41 -0800,
Matthew Butterick wrote:
> 
> Is there a reason not to redefine `log-debug` et al as macros that evaluate their arguments lazily?
> 
> Sort of like this;
> 
> (if ((current-logging-level) . is-equal-or-above? . 'debug)
>   (log-debug arg ...)
>   (void))
> 
> Because I find that my use of these functions often looks like this:
> 
> (log-debug "Value = ~a" (expensive-operation-for-logging-purposes))
> 
> The problem is that when I change to a lower logging level, the (expensive-operation) is still evaluated. 
> 
> I asked a similar question about hash-ref! not long ago. The answer was that you can get lazy evaluation by wrapping the default argument in a lambda, like so:
> 
> (hash-ref! hashtable key (λ () (expression-that-produces-value)))
> 
> But it seems there's no equivalent idiom for `log-debug` et al.
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users


Posted on the users mailing list.