Re: Why is my function faster with eval?

2014-10-13 Thread Mathias De Wachter
Very interesting thread! I'm having a similar problem and Michaels approach got me a small speedup (around 15%). When trying Mike's approach on my real data, if fails with IllegalArgumentException Too many arguments to struct constructor clojure. lang.PersistentStructMap.construct (PersistentStr

Re: Why is my function faster with eval?

2014-10-11 Thread Mike Fikes
Hey Michael, Since your eval solution essentially "cookie-cutters" out maps, each with the same keys, as fast as it can, I was playing around with what would happen if you used records, and I cobbled together something that appears to run twice as fast as the eval approach: (defn read-to-struc

Re: Why is my function faster with eval?

2014-10-10 Thread Jason Wolfe
Zipmap doesn't use transients, so calling it at runtime will be significantly slower than constructing a literal map. http://dev.clojure.org/jira/browse/CLJ-1005 On Friday, October 10, 2014 11:42:14 AM UTC-7, Michael Blume wrote: > > So I'm reading a bunch of rows from a huge csv file and mars

Re: Why is my function faster with eval?

2014-10-10 Thread Sean Corfield
On Oct 10, 2014, at 1:46 PM, Ben Wolfson wrote: > it's not quite at compile-time (since it's a dynamic call to eval, after all, > and "names" and "headers" aren't known at compile time), but it is calling it > eval-time, for lack of a better phrase. Yes, I meant when it compiles the code that e

Re: Why is my function faster with eval?

2014-10-10 Thread Ben Wolfson
it's not quite at compile-time (since it's a dynamic call to eval, after all, and "names" and "headers" aren't known at compile time), but it is calling it eval-time, for lack of a better phrase. On Fri, Oct 10, 2014 at 1:35 PM, Sean Corfield wrote: > Ah, interesting... I hadn't considered it wa

Re: Why is my function faster with eval?

2014-10-10 Thread Sean Corfield
Ah, interesting... I hadn't considered it was running the zipmap at compile-time so it only runs it once as opposed to running it for each row! Sean On Oct 10, 2014, at 1:06 PM, Ben Wolfson wrote: > I believe it's because the `mapper` function is just creating and returning a > map literal. Th

Re: Why is my function faster with eval?

2014-10-10 Thread Ashton Kemerling
Did you run it enough times to fully warm up the JVM? On Fri, Oct 10, 2014 at 4:21 PM, Michael Blume wrote: > https://github.com/MichaelBlume/eval-speed > eval-speed.core=> (time-fn read-to-maps) > "Elapsed time: 5551.011069 msecs" > nil > eval-speed.core=> (time-fn read-to-maps-fn) > "Elapsed t

Re: Why is my function faster with eval?

2014-10-10 Thread Michael Blume
https://github.com/MichaelBlume/eval-speed eval-speed.core=> (time-fn read-to-maps) "Elapsed time: 5551.011069 msecs" nil eval-speed.core=> (time-fn read-to-maps-fn) "Elapsed time: 5587.256991 msecs" nil eval-speed.core=> (time-fn read-to-maps-partial) "Elapsed time: 5606.649172 msecs" nil eval-sp

Re: Why is my function faster with eval?

2014-10-10 Thread Ben Wolfson
I believe it's because the `mapper` function is just creating and returning a map literal. The "mapper" function in the evaled version is something like this: user> (def names '[n1 n2 n3 n4]) #'user/names user> (def headers '[h1 h2 h3 h4]) #'user/headers user> `(fn [[~@names]] ~(zipmap headers nam

Re: Why is my function faster with eval?

2014-10-10 Thread Sean Corfield
It may be more to do with the difference between `for` and `map`. How do these versions compare in your benchmark: (defn read-to-maps-partial [rows] (let [headers (->> rows first (take-while (complement #{""})) (map keyword

Re: Why is my function faster with eval?

2014-10-10 Thread Laurent PETIT
Hello, Can you show the code you use for benchmarking? Le vendredi 10 octobre 2014, Michael Blume a écrit : > So I'm reading a bunch of rows from a huge csv file and marshalling those > rows into maps using the first row as keys. I wrote the function two ways: > https://gist.github.com/MichaelB

Why is my function faster with eval?

2014-10-10 Thread Michael Blume
So I'm reading a bunch of rows from a huge csv file and marshalling those rows into maps using the first row as keys. I wrote the function two ways: https://gist.github.com/MichaelBlume/c67d22df0ff9c225d956 and the version with eval is twice as fast and I'm kind of curious about why. Presumably