While playing around with clojure I've found the (time ...) macro
isn't as powerful as I'd like.  To fix this I made a timing library to
help me figure out where all my runtime is going.  If other people
find it useful I'd like to get it into contrib.

Simple overview of clojure.contrib.timing:

clojure.contrib.timing/with-timing
([expr {:name :timing-map}])
  "Executes 'expr', returns result of expr, and records its time to
execute.  Each time to execute is saved for processing later.  This
allows you to get mean/median/mode/cumulative runtimes for the
expression.
    - expr: The expression to evaluate
    - name: value to name expression, defaults to (str expr).
      timing-map: Reference to a map of recorded timings.  Defaults to
the shared global *timings."

clojure.contrib.timing/analyze-timing
  "Returns a hashmap of 'name' : '(analysis-func timing-list)'.  All
times are converted to milli seconds.  If timing-map is not given it
defaults to the shared global *timings*."
  ([analysis-func timing-map]

There are some other helper funcs/macros, but the above two are the
most important.  Future work here could give us a nice performance
timing library written in clojure, and powerful enough to allow
clojure programs to know how fast they are and tune themselves (think
serialized vs. parallelism, hostnames to connect to, etc...).

The timing-map is a ref to a map.  Each value is a list of every
runtime of the expression.  Every time the expression runs it's time-
to-run is cons-ed to the front of that expression's timing list.

Storing of the runtime into the ref is a side-effect of (with-
timing ...).  I was torn on this point, but I think it's the right
thing to do for now; performance is a side effect of code execution,
so it isn't that horrible for it to be stored as a side-effect.  This
is how the original (time ...) macro works; it reports the runtime to
stdout instead of returning it.

I'm not sure what the protocol here is for getting this thing out for
review and possible inclusion.  Is anyone interested?  How do I get my
changes out there for people to review?

Thanks!
 Chris

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to