Install Leiningen.
% lein new clj-1.2.0
% cd clj-1.2.0
[ Optionally edit project.clj to remove dependency on contrib, leaving
only clojure 1.2.0. This is only necessary if you want to convince
yourself that contrib has nothing to do with it. ]
% ls -l lib
-rw-rw-r-- 1 andy andy 3237168 Sep 24 23:47 clojure-1.2.0.jar
% cat swapping.clj
(defn swapping [#^ints a n]
(let [n (long n)
size-1 (int (dec (count a)))]
(loop [i (long n)
j 0
k 1]
(if (zero? i)
a
(let [temp (int (aget a j))]
(aset a j (aget a k))
(aset a k temp)
(recur (dec i)
(if (zero? j) size-1 (dec j))
(if (zero? k) size-1 (dec k))))))))
(def a1 (int-array 12 (reverse (list 5 7 3 8 2 9 12 10 4 1 6 11))))
(time (vec (swapping a1 100000)))
% java -server -cp lib/clojure-1.2.0.jar clojure.main
[ At this point, regardless of whether I copy and paste the forms in
swapping.clj into this session one by one to evaluate them, or if I do
load-file on it, the forms evaluate and the time reported for the last
one is about 60 msec. ]
% java -client -cp lib/clojure-1.2.0.jar clojure.main
[ Same results as above, again, whether I copy and paste the forms, or
use load-file. The timing results are a little bit different because
of -client vs. -server on the command line, but not much different. ]
% lein repl
[ Here, if I do load-file, the timing results are about the same as
above. But if I copy and paste the forms one at a time, then I get a
time like the one below for the last form:
user=> (time (vec (swapping a1 100000)))
"Elapsed time: 12683.523 msecs"
This is easily reproducible on my system Mac and Linux systems.
Happens every time. This is about 200 times longer than all of the
previously mentioned timing results. ]
Anyone else see this? Or even better, know why it happens?
I normally use SLIME within Emacs to interact with a Clojure session,
but since I was doing some performance analysis of 1.3.0-alpha1 vs.
1.2.0, and swank-clojure doesn't seem to be there yet for 1.3.0-
alpha1, I tried using 'lein repl' instead and copying and pasting
forms into it from the text editor. That is when I noticed something
funny going on.
I can avoid it now that I know about it, but was curious if it was
just me, and if not, how to correct it.
Thanks,
Andy
It appears to be related to a problem with ant. Loading the exact same
repl code by manually starting a subprocess has no problem at all.
I'm about fed up with ant; it seems that over half the problems with
Leiningen these days are either bugs in ant or problems in code that
Leiningen must include to work around bugs in ant. I'm brainstorming
ways to remove this dependency, but the JVM is pretty crippled when it
comes to things like unix process management.
-Phil
Thanks for tracking this down; just committed a fix.
-Phil