Hi, icemaze:

With trying the following code, I found now Clojure is only around 15
times slower than Java. (java6 -server)
"Elapsed time: 76.134661 msecs"
"Elapsed time: 9.509398 msecs"

"Elapsed time: 15.137116 msecs"
"Elapsed time: 1.827812 msecs"

"Elapsed time: 14.477701 msecs"
"Elapsed time: 1.057064 msecs"

"Elapsed time: 15.237137 msecs"
"Elapsed time: 1.276268 msecs"

"Elapsed time: 14.063425 msecs"
"Elapsed time: 1.050793 msecs"
(without let [words (int words)], it is 25 times slower)
"Elapsed time: 105.914041 msecs"
"Elapsed time: 8.367451 msecs"

"Elapsed time: 52.614792 msecs"
"Elapsed time: 7.747722 msecs"

"Elapsed time: 21.673251 msecs"
"Elapsed time: 1.074642 msecs"

"Elapsed time: 25.225229 msecs"
"Elapsed time: 1.197158 msecs"

"Elapsed time: 24.463993 msecs"
"Elapsed time: 1.277196 msecs"

Most part of time is spent in the two aset clauses.
After commenting out the two asets, the speed is close to Java
version.
"Elapsed time: 13.965373 msecs"
"Elapsed time: 8.466281 msecs"

"Elapsed time: 6.251176 msecs"
"Elapsed time: 7.716445 msecs"

"Elapsed time: 2.434541 msecs"
"Elapsed time: 1.103253 msecs"

"Elapsed time: 2.695829 msecs"
"Elapsed time: 1.079864 msecs"

"Elapsed time: 2.391062 msecs"
"Elapsed time: 1.062966 msecs"

Therefore, maybe we can check the implementation of aset to find the
reason.
Is it possible that 'aset' cannot handle the primitive type directly
and does all the boxing and un-boxing?


BTW: I'm thinking whether it is possible to write a macro, in which
all the values with primitive types (including parameters and literals
and locally bind vars) are automatically coerced? It can make writing
time critical codes much easier.


(import 'ArrayConverter)
(defn shorts-to-bytes [#^shorts src #^bytes dst words]
  (let [words (int words)]
  (loop [src-offset (int 0)
         dst-offset (int 0)]
         (when (< src-offset words)
           (let [sample (short (aget src src-offset))]
             (aset dst dst-offset (byte sample))
             (aset dst (unchecked-inc dst-offset) (byte (bit-shift-
right sample 8)))
             )
           (recur (unchecked-inc src-offset) (unchecked-add 2 dst-
offset)))))
   )

(def a (make-array Short/TYPE 512000))
(def b (make-array Byte/TYPE 1024000))

(doseq [n (range 5)]
  (time (shorts-to-bytes a b 512000))
  (time (ArrayConverter/shortsToBytes a b 512000))
  (println)
  )


On Sep 7, 6:18 pm, icemaze <icem...@gmail.com> wrote:
> @Christophe: thanks, your hint helped.
>
> @B Smith-Mannschott:
>
> > Questions about how best to optimize clojure code to approach java
> > performance have come up with fair regularity in the past. You might
> > find some good ideas if you search through the archives a bit.
>
> I see.
> As I said before (OP), I believe that the docs, to a certain extent,
> imply that Clojure is (or should be) as performant as Java. If the
> same level of performance cannot be obtained (at least in some cases)
> it should be pointed out.
> This would set up more realistic expectations for Clojure's users and
> avoid unneeded discussion. Otherwise you end up thinking you're doing
> something wrong because your code is so slow and you write posts
> trying to understand how to write better code.
>
> > This isn't always possible though, but that's where Clojure's Java
> > interop and a little pragmatism comes in: You've got there a nice
> > piece of Java code that does what you need and it's fast too. If you
> > want that speed from your Clojure code, don't waste time optimizing
> > the Clojure, just call the java implementation.
> > (I guess I'm not much of a purist.)
>
> That's exactly my solution. But, again, I believe the docs should be
> corrected so that people don't waste their time trying to hopelessly
> optimize their code.

--~--~---------~--~----~------------~-------~--~----~
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