On Tue, Dec 8, 2009 at 3:51 PM, Krukow <karl.kru...@gmail.com> wrote:
> I am writing a function that has to wrap other code. One simple
> approach is to do
>
> user> (defn wrap-fun [f]
>        (fn [& args]
>          (println "pre-processing")
>          (let [res (apply f args)]
>            (println "post-processing")
>            res)))
> #'user/wrap-fun
> user> (def w (wrap-fun (fn [x y] (println "calling") (+ x y))))
> #'user/w
> user> (w 2 2)
> pre-processing
> calling
> post-processing
> 4
> user>
>
> I was wondering what is the cost of using apply vs calling the wrapped
> function directly.  So my first question is: what is the performance
> cost of using apply vs calling a function ;-) Can the compiler inline
> a call to apply so there is no difference, or is there a real cost?
>
> An alternative is to use a macro to inline an expression corresponding
> to the function f in wrap-fun above, e.g.,
>
> user> (defmacro wrap-fn [params exp]
>        `(fn ~params
>           (println "pre-processing")
>           (let [res# ~exp]
>             (println "post-processing")
>             res#)))
> #'user/wrap-fn
> user> (def w (wrap-fn [x y] (do (println "calling") (+ x y))))
> #'user/w
> user> (w 2 2)
> pre-processing
> calling
> post-processing
> 4
> user>
>
> This avoid calling apply. To answer my own question, I wanted to test
> the performance difference between the inlined and the apply-based
> approach. But given that micro-performance test are known to be hard^1
> I wanted to make sure I was running the -server VM and that the code
> was getting JIT'ed.
>
> I tried starting a clojure REPL with the option  -XX:-
> PrintCompilation, but I never see any prints.
>
> java -server -XX:-PrintCompilation -cp $CLOJURE_JRE_LIBS:
> $USER_CLASSPATH clojure.main
>
> I've done a dotimes where I call a wrapped function many times.
>
> Now my question, is the code not JIT'ing or am I providing the wrong
> JVM options?
>
> /Karl
>

I think you want:

-XX:+PrintCompilation

Rich

-- 
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
Note that posts from new members are moderated - please be patient with your 
first post.
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