Thank you, Matthias. Thanks to Vincent and everyone else who answered as
well. I'll experiment with the coach.

Best regards,
--Jerry


On Fri, Apr 29, 2016 at 9:16 AM, Matthias Felleisen <[email protected]>
wrote:

>
> Jerry, you may not have understood Vincent's concise response.
>
> No reasonably expressive PL on Earth will allow you to predict
> the performance of micro-benchmarks (not to speak of large programs)
> within reasonable bounds. When compiler optimizations fail -- what
> you call "pessimizing style" -- the compiler simply generates different
> code. In a non-trivial programs, the contexts vary too much to predict
> performance. In one context, in-lining may succeed, in another a similar
> looking one may fail.
>
> We have known this for decades, and programmers have suffered from
> this problem for equally long.
>
> Vincent's dissertation does something about it. His "compiler coach"
> or "optimization coach" is NOT a profiler. It is a tool that explains
> the compiler's design decisions. In this particular case, it explains
> that the compiler can in-line a "directly apparent" call (as Matthew
> might call it) and will not in-line a "higher-order call" as I might
> refer to your choice of style.
>
> Take a look and experiment. It's NOT a profiler. I doesn't involve
> decompilation or looking at the expansion. It's pleasant to use. If
> you have feedback, please let us know
>
> -- Matthias
>
>
>
>
>
>
>
>
>
>
> On Apr 27, 2016, at 3:52 PM, Jerry Jackson <[email protected]> wrote:
>
> > I appreciate the responses; at this point, however, I'm trying to figure
> out what to do with my intuition. If those two pieces of code don't compile
> to the same thing, I'm not sure how I should approach code style. I tend to
> favor ((if x y z) foo) over (if x (y foo) (z foo)) because it avoids
> redundancy and localizes the choice. Apparently, that's a pessimising
> choice and I now don't feel like I have much intuition at all about how
> things will perform. Obviously, I can use profiling to track such things
> down but...
> >
> > I'd really be interested in how the two forms look when they've both
> been reduced to some canonical internal format.
> >
> > Thanks,
> > --Jerry
> >
> >
> >
> > On Wed, Apr 27, 2016 at 8:49 AM, Vincent St-Amour <
> [email protected]> wrote:
> > When you have a program that's surprisingly fast (or slow), you can use
> > the optimization coach in DrRacket (in the "view" menu) to see what
> > optimizations Racket applies to your code.
> >
> > For your program, the coach confirms Matthew's diagnosis that inlining
> > is what makes `fib2` faster.
> >
> > Vincent
> >
> >
> > On Wed, 27 Apr 2016 08:42:03 -0500,
> > Jerry Jackson wrote:
> > >
> > > Hello all,
> > >
> > > I was experimenting a bit yesterday and discovered something that
> surprised me. Here are two fibonacci functions:
> > >
> > > (define fib1
> > >   (letrec ([aux (lambda (i n)
> > >                   (if (< n 2)
> > >                       1
> > >                       (+ (fib1 i (- n 2)) (fib1 i (- n 1)))))])
> > >     (let ([funs (vector aux aux)])
> > >       (lambda (index num)
> > >         ((if (= index 0) aux (vector-ref funs index)) index num)))))
> > >
> > > (define fib2
> > >   (letrec ([aux (lambda (i n)
> > >                   (if (< n 2)
> > >                       1
> > >                       (+ (fib2 i (- n 2)) (fib2 i (- n 1)))))])
> > >     (let ([funs (vector aux aux)])
> > >       (lambda (index num)
> > >         (if (= index 0)
> > >             (aux index num)
> > >             ((vector-ref funs index) index num))))))
> > >
> > > I expected them to behave basically identically (in fact, I thought
> they would probably generate the same code). However, that was not the case:
> > >
> > > > (time (fib1 0 40))
> > > cpu time: 4490 real time: 4489 gc time: 0
> > > 165580141
> > > > (time (fib1 1 40))
> > > cpu time: 5031 real time: 5027 gc time: 0
> > > 165580141
> > > > (time (fib2 0 40))
> > > cpu time: 3042 real time: 3040 gc time: 0
> > > 165580141
> > > > (time (fib2 1 40))
> > > cpu time: 5031 real time: 5027 gc time: 0
> > > 165580141
> > > > (time (fib1 0 40))
> > > cpu time: 4535 real time: 4532 gc time: 0
> > > 165580141
> > > > (time (fib2 0 40))
> > > cpu time: 3027 real time: 3025 gc time: 0
> > > 165580141
> > > >
> > >
> > > It looks like one of the functions is 1.5 times faster than the other
> (in the i == 0 case). Any ideas as to why?
> > >
> > > Thanks,
> > > --Jerry Jackson
> > >
> > > --
> > > You received this message because you are subscribed to the Google
> Groups "Racket Users" group.
> > > To unsubscribe from this group and stop receiving emails from it, send
> an email to [email protected].
> > > For more options, visit https://groups.google.com/d/optout.
> >
> >
> > --
> > You received this message because you are subscribed to the Google
> Groups "Racket Users" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> an email to [email protected].
> > For more options, visit https://groups.google.com/d/optout.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to