Hi,

I tried replacing a closure with a dynamically built and evaluated 
metafunction but discovered that it was actually slower.
Here's a minimal example:

(defn f1 [x]        (fn [y ] (=    x  y )))
(defn f2 [x] (eval `(fn [y#] (=   ~x  y#))))
(defn f3 [x] (eval `(fn [y#] (= ~@[x] y#))))

(use 'criterium.core)

(def v nil) ; nil -> same speed.
(let [f (f1 v)] (quick-bench (f v))) ;  7.1ns
(let [f (f2 v)] (quick-bench (f v))) ;  5.4ns
(let [f (f3 v)] (quick-bench (f v))) ;  5.4ns

(def v [10 20]) ; vector -> f2 slower
(let [f (f1 v)] (quick-bench (f v))) ;  6.8ns
(let [f (f2 v)] (quick-bench (f v))) ; 78.0ns
(let [f (f3 v)] (quick-bench (f v))) ;  5.3ns

(def v {10 20}) ; map -> f2 and f3 slower?!
(let [f (f1 v)] (quick-bench (f v))) ;   6.6ns
(let [f (f2 v)] (quick-bench (f v))) ; 151.0ns
(let [f (f3 v)] (quick-bench (f v))) ; 152.0ns

I guess f2 runs this much slower than f1 because it doesn't actually pass a 
reference to x when unquoting, but clones the value, which means it needs 
to compare the lists element-wise. The other cases all compare the 
references which is why the nil case runs at the same speed.

Why does unquoting ~x clone the vector?
And why doesn't splice unquoting ~@[x] appear to clone the vector, but 
*does* clone the map?!

Is there a way to pass all values per reference into a quote, to get 
exactly the same behaviour as f1?


Cheers,

-- 
pascal

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to