In many cases this is a "no duh" since speed-up loops can be inconspicuously 
small.
This post is regarding the macro writers' bill of rights, which I think Racket 
is violating.

I have two definitional interpreters that are run in an "abstract 
interpretation monad" if you will. One is syntactically generalized to allow 
for different interpretation strategies. In the case that the chosen strategy 
is the original one, they produce almost exactly the same code.

By almost exactly I mean
(let () (set-add res v))

versus

(let ([res res])
 (set-add (let ([v v]) 
             (set-add res (let () v)))))

cpu time: 5480 real time: 5584 gc time: 108
cpu time: 187492 real time: 187484 gc time: 1688

Code here:
https://gist.github.com/3836966

I've separated the commonalities into a module, where small non-recursive 
functions that are called in the main loop are turned into define-syntax-rules.

The main differences are in the macros in the tweaks module, and deref/get-val 
in the slow module. Diffing the fast/slow modules should show you very minor 
changes, yet the performance differences are huge.

Any insight anyone can share on this would be a great help.

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

Reply via email to